{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "adcaa421",
   "metadata": {},
   "source": [
    "# 第一周作业\n",
    "\n",
    "## 1 基本分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "bc3c372a",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "345a6fab",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_train=pd.read_csv('train.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "4b153faf",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_test=pd.read_csv('test.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "3df52aee",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(404290, 6) (2345796, 3)\n"
     ]
    }
   ],
   "source": [
    "print(df_train.shape,df_test.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "043d8c4c",
   "metadata": {},
   "source": [
    "观察是否存在缺失值情况。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "993a7aa4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "question1    1\n",
       "question2    2\n",
       "dtype: int64"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train.isnull().sum()[df_train.isnull().sum()>0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "5ad756b3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>qid1</th>\n",
       "      <th>qid2</th>\n",
       "      <th>question1</th>\n",
       "      <th>question2</th>\n",
       "      <th>is_duplicate</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>363362</th>\n",
       "      <td>363362</td>\n",
       "      <td>493340</td>\n",
       "      <td>493341</td>\n",
       "      <td>NaN</td>\n",
       "      <td>My Chinese name is Haichao Yu. What English na...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            id    qid1    qid2 question1  \\\n",
       "363362  363362  493340  493341       NaN   \n",
       "\n",
       "                                                question2  is_duplicate  \n",
       "363362  My Chinese name is Haichao Yu. What English na...             0  "
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train[df_train['question1'].isnull()==True]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "ee1a18ae",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>qid1</th>\n",
       "      <th>qid2</th>\n",
       "      <th>question1</th>\n",
       "      <th>question2</th>\n",
       "      <th>is_duplicate</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>105780</th>\n",
       "      <td>105780</td>\n",
       "      <td>174363</td>\n",
       "      <td>174364</td>\n",
       "      <td>How can I develop android app?</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>201841</th>\n",
       "      <td>201841</td>\n",
       "      <td>303951</td>\n",
       "      <td>174364</td>\n",
       "      <td>How can I create an Android app?</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            id    qid1    qid2                         question1 question2  \\\n",
       "105780  105780  174363  174364    How can I develop android app?       NaN   \n",
       "201841  201841  303951  174364  How can I create an Android app?       NaN   \n",
       "\n",
       "        is_duplicate  \n",
       "105780             0  \n",
       "201841             0  "
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train[df_train['question2'].isnull()==True]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e6e8ba9e",
   "metadata": {},
   "source": [
    "可以看出，如果有一个问题是缺失值，is_duplicate就是0，也是符合预期的。  \n",
    "现在来看看，question是否有重复的，我们先把q1和q2合在一起统计一下有没有重复的。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "df5be431",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_ques=pd.DataFrame(df_train['question1'].to_list()+df_train['question2'].to_list(),columns=['question'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "ca2806d7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>question</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>What is the step by step guide to invest in sh...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>What is the story of Kohinoor (Koh-i-Noor) Dia...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>How can I increase the speed of my internet co...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Why am I mentally very lonely? How can I solve...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Which one dissolve in water quikly sugar, salt...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>808575</th>\n",
       "      <td>How many keywords are there in PERL Programmin...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>808576</th>\n",
       "      <td>Is it true that there is life after death?</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>808577</th>\n",
       "      <td>What's this coin?</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>808578</th>\n",
       "      <td>I am having little hairfall problem but I want...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>808579</th>\n",
       "      <td>What is it like to have sex with your cousin?</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>808580 rows × 1 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                 question\n",
       "0       What is the step by step guide to invest in sh...\n",
       "1       What is the story of Kohinoor (Koh-i-Noor) Dia...\n",
       "2       How can I increase the speed of my internet co...\n",
       "3       Why am I mentally very lonely? How can I solve...\n",
       "4       Which one dissolve in water quikly sugar, salt...\n",
       "...                                                   ...\n",
       "808575  How many keywords are there in PERL Programmin...\n",
       "808576         Is it true that there is life after death?\n",
       "808577                                  What's this coin?\n",
       "808578  I am having little hairfall problem but I want...\n",
       "808579      What is it like to have sex with your cousin?\n",
       "\n",
       "[808580 rows x 1 columns]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_ques"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "f6eb80fe",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "What are the best ways to lose weight?                                                                  161\n",
       "How can you look at someone's private Instagram account without following them?                         120\n",
       "How can I lose weight quickly?                                                                          111\n",
       "What's the easiest way to make money online?                                                             88\n",
       "Can you see who views your Instagram?                                                                    79\n",
       "                                                                                                       ... \n",
       "How Modi's demonestation affect the people living in India?                                               2\n",
       "How do I start writing a giallo story?                                                                    2\n",
       "How do I remove a picture for my Facebook profile that is not of me?                                      2\n",
       "What are good ways to combat depression?                                                                  2\n",
       "How do I prove the relationship between nodes n, and height h of a FuII Binary Tree is 2h =(n+l) /2?      2\n",
       "Name: question, Length: 111872, dtype: int64"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_ques.question.value_counts()[df_ques.question.value_counts()>1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "8eedc846",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "<ipython-input-11-c365111620ec>:4: MatplotlibDeprecationWarning: The 'nonposy' parameter of __init__() has been renamed 'nonpositive' since Matplotlib 3.3; support for the old name will be dropped two minor releases later.\n",
      "  plt.yscale('log', nonposy='clip')\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'Number of questions')"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtMAAAFNCAYAAADCcOOfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAsf0lEQVR4nO3deZhkZXn38e+PXREHFdyAcdBBFJcYbXFNREUFYcAlvkKMUYJMMMElUeNojOKSiFETTUTNCIhxgRBfF0YwuItxZRGURXTEUUYQUHRAfEWR+/3jnMaapqu7qrprqor5fq6rrqnznO0+T1VN3/XUfc5JVSFJkiSpf1uMOgBJkiRpUplMS5IkSQMymZYkSZIGZDItSZIkDchkWpIkSRqQybQkSZI0IJNpSYsqyR8luWTUcYxSGu9N8vMk3xh1PN0keXeSfxh1HJI0yUympVuJJOuS7DvkfeyTZP0s7V9I8jyAqvpSVe3Zw7aOTvKBYcQ5Bh4NPAHYtar2HnUwAEmem+R/O9uq6siqev2oYtLoJKkky0cdh3RrYDIt6VYnyVYjDuEewLqqun7EcaiLMXiPSLqVMJmWbuWSbJvkbUkubx9vS7Jtx/y/S3JFO+95Cx2xmjl6neTlSX6c5LoklyR5fJL9gFcCz0zyyyTnt8vePcmpSa5JsjbJER3buU2S97WlExe3cXfuZ127r28B1yfZKsmqJN9v931Rkqd2LP/cJF9O8q9JfpHk0iSPbNsvS3JVkufMcZyzxprkcOA44BHtsb12lnW3TPKWJD9t9/vXbb9v1XEs+3Ysv9EofpKHJ/lKG/f5SfaZcVyXtsf8gyTPSnJf4N0dMf2iXfbEJG/oWPeI9liuaY/t7h3zKsmRSb7XvgbHJkmXvtk7yVfb+K5I8o4k28zY1gvbOH+a5M1Jtpjxuvx7kg1JvpPk8R3rLklyfLvdHyd5Q5It23n3SvK5JD9rt/vBJDsu8D3yv+1r9fO2P/fvmH/HNOU8l7fzP9Yx78Ak57V98JUkD5ytr9pl75fk022/X5nklW17189uZvmlIR2f3fa1PTbJae2xfT3Jvdp5Z7arnN++H56ZZKckn2jjvSbJl6ZfE0nzqCofPnzcCh7AOmDfWdpfB3wNuDOwM/AV4PXtvP2AnwD3A24LvB8oYHmXfewDrJ+l/QvA82YuA+wJXAbcvZ1eBtyrfX408IEZ2/ki8E5gO+BBwNXA49t5x7Tz7wDsCnyrM5b2+M8DdgNu07Y9A7g7zcDBM4Hrgbu1854L3AgcBmwJvAH4EXAssC3wROA64HZd+mKuWJ8L/O8cr9WRwHfaWO8IfL7t961mey07+wrYBfgZ8OT2uJ7QTu8MbA9cC+zZLns34H7dYgJOBN7QPn8c8FPgwe3x/ztwZseyBXwC2BFY2h7vfl2O7yHAw4Gt2tf8YuDFM7b1+fbYlwLf5ffvn+nX5W+ArdvXbQNwx3b+x4D/aI/1zsA3gL9s5y1v+2Pbtj/OBN62wPfIb4EjaN4jzwcuB9LOPw34L5r35NbAY9r2BwNXAQ9r13tOu+9tZ+mrHYArgJfQvJd2AB7Ww2d3ttfz5s9u+9peA+zdvg4fBE6ebdl2+o00X7i2bh9/NH2cPnz4mPsx8gB8+PCxOA+6J9PfB57cMf0kmhIEgBOAN3bMWz7zj+yMbe0D3AT8YsbjRmZPppe3ScW+wNYztnU0Hcl0m+D8Dtiho+2NwInt80uBJ3XMex63TKb/Yp4+Og84uH3+XOB7HfMe0B77XTrafgY8aJbtzBfrLRKdGet/DjiyY/qJ9J5Mvxx4/4ztnUGTsG3fvh5Pp00WO5a5RUxsnEwfD/xzx7zb0SSSy9rpAh7dMf8UYFWP780XAx/tmC46EnHgr4DPdsR5c8Latn0DeDZwF+CGzmMDDgU+32W/TwG+ucD3yNqOebdtY78rzReVm4A7zLKNd9EmvR1tl9Am2zPaD+2MsY/P7myv58xk+riOeU8GvjPbsu3064CP0+Wz78OHj+4Pf8KRbv3uDvywY/qHbdv0vMs65t38PMnS9ifgXyb5Zccyl1fVjp0PYKOfm6dV1VqaROpo4KokJ3eWDswS5zVVdd2MWHeZL9ZubUn+vOOn9l8A9wd26ljkyo7n/6+NeWbb7QaIdT4zj+WH3RacxT2AZ0wfU3tcj6YZTb2eZnT1SOCK9if++/QR081xVNUvab5MdB7TTzqe/4rZ+4Yk925LBn6S5Frgn9i43+GWx9/5vvhxVdUs8+9BM2p6Rcex/wfNyC1J7ty+x37c7vcD8+y3l/fIzcdcVb9qn96O5gvVNVX181m64B7AS2a8RrvNOMZpu9EkzbOZ67Pbi55er9abgbXAp9rym1V97EfarJlMS7d+l9P8cZ+2tG2D5uflXTvm7Tb9pKp+VFW3m34MuvOq+lBVPbqNoYA3Tc+aJc47JtlhRqw/ni/Wzt1NP0lyD+A9wFHAndqk/wJg1jrfPs0X63yuYOP4l86Yfz3NKOi0u3Y8v4xmZLrzC832VXUMQFWdUVVPoBk5/Q5NH8At+3umjd4nSbYH7tTHMXV6V7vvParq9jT18TP7febxX94xvcuMeuzp+ZfRjEzv1HHst6+q+7XLvZHmOB/Y7vfPZtnvYr1HLqN5D+zYZd4/zniNbltVJ3VZ9l5d9jHXZ3ej90iSzvdI36rquqp6SVXdE1gB/G1nrbqk7kympVuXrZNs1/HYCjgJeFWSnZPsBLyaZsQOmp/qD0ty3yS3bectmiR7Jnlce9LUr2lGen/Xzr4SWDZ9klNVXUZTE/rGNvYHAofT1HpOx/qKJHdIsgtNAjSX7WkSp6vbWA6jGXVcsB5inc8pwAuT7JrkDsDMUcDzgEOSbJ1kCviTjnkfAFYkeVKaExm3S3PS565J7pLkoDYRvgH4JRv3967pOBFwhg/RvBce1L5e/wR8varW9XhMnXagqd3+ZTsy/vxZlnlZ+1ruBryIpvZ42p1p+mfrJM8A7gucXlVXAJ8C3prk9km2SHPS4WM69vtL4Bfte+Rl88Q58HukjeWTwDvb49g6yR+3s98DHJnkYWlsn+SAGV++pn0CuGuSF6c54XCHJA9r58312T0fuF/7em1H8+tPP64E7jk9keaEyeXtl5hrad43v+u2sqTfM5mWbl1Op0lYpx9H05xYdzbNCXvfBs5t26iqTwL/RnMy2Frgq+12blikeLalOXHwpzQ/Od+ZZpQS4L/bf3+W5Nz2+aE0J6xdDnwUeE1Vfbqd9zpgPfAD4DPAh+eKs6ouAt5Kc0xX0tREf3kxDqqHWOfzHpo65/NpXo+PzJj/DzSjlT8HXkuT6AI3J/IH0/Tj1TQjmy+j+f98C5oT2S6nOfnsMTT1yNDUaV8I/CTJT2cGVFWfbff7f2lGzu8FHNLj8cz0UuBPaU7gfA8bJ8rTPg6cQ/PF4TSamu1pXwf2oHnf/CPwJ1X1s3benwPbABfR9M+HaUbhoemrB9OcsHgat+zXjSzCe+TZNHXl36E5N+DF7XbPpjlp8R1tjGtpapxni+E6mpMmV9B8Rr4HPLadPddn97s0n4nPtOvMWmo1h6OB97VlKP+Hpr8/Q/Nl5KvAO6vqC31uU9osTZ+RLEmkuYTaBTRXHbhx1PHMJcnzgUOq6jHzLjzmkiyj+ZKw9bj3+2JIUjQlIGtnmfdcmpNZH73JA5OkATgyLW3mkjw1yTZtucGbgDXjmNAluVuSR7U/7e9JMwL70VHHJUnavI1NMt3+gfzHNBfqf86o45E2I39JUy7wfZoaydnqW8fBNjRXbriOpmTh4zTXeZYkaWSGWuaR5ATgQOCqqrp/R/t+wNtpLmZ/XFUdk+auUwfT1Pmd1tbvSZIkSWNr2CPTJ9LcYe1maW77eiywP7AXcGiSvWjulPbVqvpbxndkTJIkSbrZUJPpqjqTZqS50940d5S6tKp+A5xMMyK9nuasZ/ByPJIkSZoAW41gn7uw8R2o1gMPoyn7+PckfwSc2W3lJCuBlQDbb7/9Q+5zn15v7iVJkiQN5pxzzvlpVe08s30UyfRsd5aq9jath8+3clWtBlYDTE1N1dlnn73I4UmSJEkbS/LD2dpHcTWP9Wx8G9ld2fg2svNKsiLJ6g0bNixqYJIkSVI/RpFMnwXskWT39ra2hwCn9rOBqlpTVSuXLFkylAAlSZKkXgw1mU5yEs1tSfdMsj7J4e3NII6iuZXuxcApVXVhn9t1ZFqSJEkjN9G3E7dmWpIkSZtCknOqampm+9jcAVGSJEmaNBOZTFvmIUmSpHEwkcm0JyBKkiRpHExkMi1JkiSNg4lMpi3zkCRJ0jiYyGTaMg9JkiSNg1HcTnziLVt1Wt/rrDvmgCFEIkmSpFGayJFpyzwkSZI0DiYymbbMQ5IkSeNgIpNpSZIkaRyYTEuSJEkDmshk2pppSZIkjYOJTKatmZYkSdI4mMhkWpIkSRoHJtOSJEnSgEymJUmSpAGZTEuSJEkDmshk2qt5SJIkaRxMZDLt1TwkSZI0DiYymZYkSZLGgcm0JEmSNCCTaUmSJGlAJtOSJEnSgEymJUmSpAFNZDLtpfEkSZI0DiYymfbSeJIkSRoHE5lMS5IkSePAZFqSJEkakMm0JEmSNCCTaUmSJGlAJtOSJEnSgEymJUmSpAGZTEuSJEkDGptkOsk+Sb6U5N1J9hl1PJIkSdJ8hppMJzkhyVVJLpjRvl+SS5KsTbKqbS7gl8B2wPphxiVJkiQthmGPTJ8I7NfZkGRL4Fhgf2Av4NAkewFfqqr9gZcDrx1yXJIkSdKCDTWZrqozgWtmNO8NrK2qS6vqN8DJwMFVdVM7/+fAtsOMS5IkSVoMW41gn7sAl3VMrwceluRpwJOAHYF3dFs5yUpgJcDSpUuHF6UkSZI0j1Ek05mlrarqI8BH5lu5qlYDqwGmpqZqkWOTJEmSejaKq3msB3brmN4VuLyfDSRZkWT1hg0bFjUwSZIkqR+jSKbPAvZIsnuSbYBDgFP72UBVramqlUuWLBlKgJIkSVIvhn1pvJOArwJ7Jlmf5PCquhE4CjgDuBg4paouHGYckiRJ0jAMtWa6qg7t0n46cPqg202yAlixfPnyQTchSZIkLdjY3AGxH5Z5SJIkaRxMZDLtCYiSJEkaBxOZTDsyLUmSpHEwkcm0JEmSNA4mMpm2zEOSJEnjYCKTacs8JEmSNA4mMpmWJEmSxsFEJtOWeUiSJGkcTGQybZmHJEmSxsFEJtOSJEnSODCZliRJkgZkMi1JkiQNaCKTaU9AlCRJ0jiYyGTaExAlSZI0DiYymZYkSZLGgcm0JEmSNCCTaUmSJGlAE5lMewKiJEmSxsFEJtOegChJkqRxMJHJtCRJkjQOTKYlSZKkAZlMS5IkSQMymZYkSZIGZDItSZIkDchkWpIkSRrQRCbTXmdakiRJ42Aik2mvMy1JkqRxMJHJtCRJkjQOTKYlSZKkAZlMS5IkSQMymZYkSZIGZDItSZIkDchkWpIkSRqQybQkSZI0oLFKppNsn+ScJAeOOhZJkiRpPkNNppOckOSqJBfMaN8vySVJ1iZZ1THr5cApw4xJkiRJWizzJtNJXpTk9mkcn+TcJE/scfsnAvvN2N6WwLHA/sBewKFJ9kqyL3ARcGVfRyBJkiSNyFY9LPMXVfX2JE8CdgYOA94LfGq+FavqzCTLZjTvDaytqksBkpwMHAzcDtieJsH+f0lOr6qbej4SSZIkaRPrJZlO+++TgfdW1flJMtcK89gFuKxjej3wsKo6CiDJc4Gfdkukk6wEVgIsXbp0AWFsWstWndbX8uuOOWBIkUiSJGmx9FIzfU6ST9Ek02ck2QFYyIjxbIl43fyk6sSq+kS3latqdVVNVdXUzjvvvIAwJEmSpIXpZWT6cOBBwKVV9askd6Ip9RjUemC3juldgcv72UCSFcCK5cuXLyAMSZIkaWHmHZluyy2uBPZK8sfA/YAdF7DPs4A9kuyeZBvgEODUfjZQVWuqauWSJUsWEIYkSZK0MPOOTCd5E/BMmitt/K5tLuDMHtY9CdgH2CnJeuA1VXV8kqOAM4AtgROq6sJ+gnZkWpIkSeOglzKPpwB7VtUN/W68qg7t0n46cHq/2+tYfw2wZmpq6ohBtyFJkiQtVC8nIF4KbD3sQPqRZEWS1Rs2bBh1KJIkSdqM9TIy/SvgvCSfBW4ena6qFw4tqnk4Mi1JkqRx0EsyfSp9niAoSZIkbQ7mTaar6n3tVTfu3TZdUlW/HW5Yc/MEREmSJI2DeWumk+wDfA84Fngn8N32Enkj46XxJEmSNA56KfN4K/DEqroEIMm9gZOAhwwzMEmSJGnc9XI1j62nE2mAqvouY3Z1D0mSJGkUehmZPjvJ8cD72+lnAecML6T5WTMtSZKkcdDLyPTzgQuBFwIvorkT4pHDDGo+1kxLkiRpHPRyNY8bgH9pH5IkSZJaXZPpJKdU1f9J8m2gZs6vqgcONTJJkiRpzM01Mv2i9t8DN0Ug/bBmWpIkSeOga810VV3RPv2rqvph5wP4q00TXtfYrJmWJEnSyPVyAuITZmnbf7EDkSRJkibNXDXTz6cZgb5Xkm91zNoB+PKwA5MkSZLG3Vw10x8CPgm8EVjV0X5dVV0z1KgkSZKkCTBXzfSGqloHvAr4SVsrvTvwZ0l23DThzS7JiiSrN2zYMMowJEmStJlL1S2uerfxAsl5wBSwDDgDOBXYs6qePOzg5jM1NVVnn332Jt/vslWnbfJ9zmfdMQeMOgRJkqRbrSTnVNXUzPZeTkC8qapuBJ4GvK2q/ga422IHKEmSJE2aXpLp3yY5FPhz4BNt29bDC0mSJEmaDL0k04cBjwD+sap+kGR34APDDUuSJEkaf3NdzQOAqrooycuBpe30D4Bjhh2YJEmSNO7mHZlub919HvA/7fSDkpw65LgkSZKksddLmcfRwN7ALwCq6jyaS+RJkiRJm7Vekukbq2rmBZ3nvp7ekHmdaUmSJI2DXpLpC5L8KbBlkj2S/DvwlSHHNaeqWlNVK5csWTLKMCRJkrSZ6yWZfgFwP+AG4CTgWuDFQ4xJkiRJmgi9XM3jV8Dftw9JkiRJrXmT6SSfZ5Ya6ap63FAikiRJkibEvMk08NKO59sBTwduHE44kiRJ0uTopczjnBlNX07yxSHFowEtW3VaX8uvO+aAIUUiSZK0+eilzOOOHZNbAA8B7jq0iCRJkqQJ0UuZxzk0NdOhKe/4AXD4MIOSJEmSJkEvZR6b5G6HSe4LvAjYCfhsVb1rU+xXkiRJGlQvZR5Pm2t+VX1kjnVPAA4Erqqq+3e07we8HdgSOK6qjqmqi4Ejk2wBvKfH+CVJkqSR6aXM43DgkcDn2unHAl8ANtCUf3RNpoETgXcA/zndkGRL4FjgCcB64Kwkp1bVRUkOAla160iSJEljrZdkuoC9quoKgCR3A46tqsPmXbHqzCTLZjTvDaytqkvb7Z0MHAxcVFWnAqcmOQ34UO+HIUmSJG16vSTTy6YT6daVwL0XsM9dgMs6ptcDD0uyD/A0YFvg9G4rJ1kJrARYunTpAsKQJEmSFqaXZPoLSc4ATqIZpT4E+PwC9plZ2qqqvkBTPjKnqloNrAaYmpq6xZ0ZJUmSpE2ll6t5HJXkqcAft02rq+qjC9jnemC3juldgcv72UCSFcCK5cuXLyAMSZIkaWF6GZmmTZ4XkkB3OgvYI8nuwI9pRrr/tJ8NVNUaYM3U1NQRixSTJEmS1LeekulBJTkJ2AfYKcl64DVVdXySo4AzaC6Nd0JVXdjndh2ZXiBvPy5JkrRwQ02mq+rQLu2nM8dJhj1s15FpSZIkjdwW3WYk+Wz775s2XTi9SbIiyeoNGzaMOhRJkiRtxuYamb5bkscAB7XXgt7oKhxVde5QI5uDI9ObXr9lIWBpiCRJuvWbK5l+Nc3dCHcF/mXGvAIeN6ygJEmSpEnQNZmuqg8DH07yD1X1+k0Y07w8AVGSJEnjoGvN9LSqen2Sg5K8pX0cuCkCmyemNVW1csmSJaMORZIkSZuxeZPpJG8EXgRc1D5e1LZJkiRJm7VeLo13APCgqroJIMn7gG8CrxhmYJIkSdK4m3dkurVjx/OR11Z4aTxJkiSNg16S6TcC30xyYjsqfQ7wT8MNa27WTEuSJGkczFvmUVUnJfkC8FCaa02/vKp+MuzAJEmSpHHX0+3Eq+oK4NQhxyJJkiRNlF5rpseKNdOSJEkaBxOZTFszLUmSpHEwZzKdZIskF2yqYCRJkqRJMmcy3V5b+vwkSzdRPJIkSdLE6OUExLsBFyb5BnD9dGNVHTS0qHSrsGzVaX0tv+6YA4YUiSRJ0nD0kky/duhR9CnJCmDF8uXLRx2KJEmSNmPznoBYVV8E1gFbt8/PAs4dclzzxeQJiJIkSRq5eZPpJEcAHwb+o23aBfjYEGOSJEmSJkIvl8b7a+BRwLUAVfU94M7DDEqSJEmaBL0k0zdU1W+mJ5JsBdTwQpIkSZImQy/J9BeTvBK4TZInAP8NrBluWJIkSdL46+VqHquAw4FvA38JnA4cN8ygtHnyUnqSJGnSzJtMV9VNSd4HfJ2mvOOSqrLMQ5IkSZu9Xq7mcQDwfeDfgHcAa5PsP+zA5olpRZLVGzZsGGUYkiRJ2sz1UjP9VuCxVbVPVT0GeCzwr8MNa25eZ1qSJEnjoJdk+qqqWtsxfSlw1ZDikSRJkiZG15rpJE9rn16Y5HTgFJqa6WfQ3AVRkiRJ2qzNdQLiio7nVwKPaZ9fDdxhaBFJkiRJE6JrMl1Vh23KQCRJkqRJM++l8ZLsDrwAWNa5fFUdNLywpPl5XWpJkjRqvdy05WPA8TR3PbxpqNFIkiRJE6SXZPrXVfVvQ49EkiRJmjC9JNNvT/Ia4FPADdONVXXuYgeT5CnAAcCdgWOr6lOLvQ9JkiRpsfSSTD8AeDbwOH5f5lHt9LySnAAcSHO96vt3tO8HvB3YEjiuqo6pqo8BH0tyB+AtNAm8JEmSNJZ6SaafCtyzqn4z4D5OpLkN+X9ONyTZEjgWeAKwHjgryalVdVG7yKva+ZIkSdLY6uUOiOcDOw66g6o6E7hmRvPewNqqurRN0k8GDk7jTcAnh1FGIkmSJC2mXkam7wJ8J8lZbFwzvZBL4+0CXNYxvR54GM0l+PYFliRZXlXvnrlikpXASoClS5cuIARtbryUniRJWmy9JNOvGcJ+M0tbtVcNmfPKIVW1GlgNMDU1VUOITZIkSerJvMl0VX1xCPtdD+zWMb0rcHmvKydZAaxYvnz5Yscl3cyRbEmSNJ95a6aTXJfk2vbx6yS/S3LtAvd7FrBHkt2TbAMcApza68pVtaaqVi5ZsmSBYUiSJEmDmzeZrqodqur27WM74Ok0V+foSZKTgK8CeyZZn+TwqroROAo4A7gYOKWqLuxjmyuSrN6wYUOvq0iSJEmLrpea6Y1U1ceSrOpj+UO7tJ8OnN7v/tt11wBrpqamjhhkfUmSJGkxzJtMJ3lax+QWwBTNTVskSZKkzVovI9MrOp7fCKwDDh5KND3yBERJkiSNg16u5nHYpgikH5Z5SJIkaRx0TaaTvHqO9aqqXj+EeCRJkqSJMdfVPK6f5QFwOPDyIcc1J6/mIUmSpHHQNZmuqrdOP2juOHgb4DDgZOCemyi+brF5nWlJkiSN3Jw100nuCPwt8CzgfcCDq+rnmyIwSZIkadx1HZlO8maaOxVeBzygqo4el0TaMg9JkiSNg7lqpl8C3B14FXB5xy3Fr1uE24kviGUekiRJGgddyzyqat5bjUtamGWrTutr+XXHHDCkSCRJ0iBMmCVJkqQBTWQybc20JEmSxsFEJtPWTEuSJGkcTGQyLUmSJI0Dk2lJkiRpQHPetEVS7/q9MockSZp8jkxLkiRJA5rIZNqreUiSJGkcTGQy7dU8JEmSNA6smZYmiHdMlCRpvEzkyLQkSZI0DhyZlnQzR74lSeqPI9OSJEnSgEymJUmSpAFNZDLtpfEkSZI0DiYymfbSeJIkSRoHE5lMS5IkSePAZFqSJEkakJfGk27F+r3UnSRJ6o8j05IkSdKATKYlSZKkAZlMS5IkSQMymZYkSZIGNDbJdJJ7Jjk+yYdHHYskSZLUi6Em00lOSHJVkgtmtO+X5JIka5OsAqiqS6vq8GHGI0mSJC2mYY9Mnwjs19mQZEvgWGB/YC/g0CR7DTkOSZIkadENNZmuqjOBa2Y07w2sbUeifwOcDBw8zDgkSZKkYRhFzfQuwGUd0+uBXZLcKcm7gT9M8opuKydZmeTsJGdfffXVw45VkiRJ6moUd0DMLG1VVT8Djpxv5apaDawGmJqaqkWOTZIkSerZKJLp9cBuHdO7Apf3s4EkK4AVy5cvX8y4JPWp39uVrzvmgCFFIknSaIyizOMsYI8kuyfZBjgEOLWfDVTVmqpauWTJkqEEKEmSJPVi2JfGOwn4KrBnkvVJDq+qG4GjgDOAi4FTqurCPre7IsnqDRs2LH7QkiRJUo+GWuZRVYd2aT8dOH0B210DrJmamjpi0G1IkiRJCzU2d0CUJEmSJs1EJtOWeUiSJGkcTGQy7QmIkiRJGgcTmUxLkiRJ42Aik2nLPCRJkjQOJjKZtsxDkiRJ42Aik2lJkiRpHExkMm2ZhyRJksbBRCbTlnlIkiRpHExkMi1JkiSNA5NpSZIkaUATmUxbMy1JkqRxMJHJtDXTkiRJGgcTmUxLkiRJ48BkWpIkSRqQybQkSZI0IJNpSZIkaUBbjTqAQSRZAaxYvnz5qEOR1Idlq07re511xxwwhEgkSVocEzky7dU8JEmSNA4mMpmWJEmSxoHJtCRJkjQgk2lJkiRpQCbTkiRJ0oBMpiVJkqQBeWk8SZu1fi/X56X6JEmdJnJk2kvjSZIkaRxMZDItSZIkjQOTaUmSJGlAJtOSJEnSgEymJUmSpAGZTEuSJEkDMpmWJEmSBmQyLUmSJA3IZFqSJEka0NjcATHJ9sA7gd8AX6iqD444JEmSJGlOQx2ZTnJCkquSXDCjfb8klyRZm2RV2/w04MNVdQRw0DDjkiRJkhbDsMs8TgT262xIsiVwLLA/sBdwaJK9gF2By9rFfjfkuCRJkqQFG2qZR1WdmWTZjOa9gbVVdSlAkpOBg4H1NAn1ecyR5CdZCawEWLp06eIHLWmsLFt12qhD2KQ2xfGuO+aAoW6/32MYdjy3BoO8L3ydNQluDe+jUZyAuAu/H4GGJoneBfgI8PQk7wLWdFu5qlZX1VRVTe28887DjVSSJEmawyhOQMwsbVVV1wOH9bSBZAWwYvny5YsamCRJktSPUYxMrwd265jeFbi8nw1U1ZqqWrlkyZJFDUySJEnqxyiS6bOAPZLsnmQb4BDg1BHEIUmSJC3IsC+NdxLwVWDPJOuTHF5VNwJHAWcAFwOnVNWFfW53RZLVGzZsWPygJUmSpB4N+2oeh3ZpPx04fQHbXQOsmZqaOmLQbUiSJEkLNZG3E3dkWpIkSeNgIpNpT0CUJEnSOJjIZFqSJEkaBxOZTFvmIUmSpHEwkcm0ZR6SJEkaBxOZTEuSJEnjIFU16hgGluRq4IebaHc7AT/dRPu6NbC/+mN/9cf+6o/91R/7qz/2V3/sr/6MU3/do6p2ntk40cn0ppTk7KqaGnUck8L+6o/91R/7qz/2V3/sr/7YX/2xv/ozCf1lmYckSZI0IJNpSZIkaUAm071bPeoAJoz91R/7qz/2V3/sr/7YX/2xv/pjf/Vn7PvLmmlJkiRpQI5MS5IkSQMymZ5Hkv2SXJJkbZJVo45n3CTZLcnnk1yc5MIkL2rb75jk00m+1/57h1HHOk6SbJnkm0k+0U7bX10k2THJh5N8p32fPcL+6i7J37SfxQuSnJRkO/trY0lOSHJVkgs62rr2UZJXtH8DLknypNFEPTpd+uvN7WfyW0k+mmTHjnn214z+6pj30iSVZKeONvtrlv5K8oK2Ty5M8s8d7WPXXybTc0iyJXAssD+wF3Bokr1GG9XYuRF4SVXdF3g48NdtH60CPltVewCfbaf1ey8CLu6Ytr+6ezvwP1V1H+APaPrN/ppFkl2AFwJTVXV/YEvgEOyvmU4E9pvRNmsftf+fHQLcr13nne3fhs3Jidyyvz4N3L+qHgh8F3gF2F+tE7llf5FkN+AJwI862uyvWforyWOBg4EHVtX9gLe07WPZXybTc9sbWFtVl1bVb4CTaV5ctarqiqo6t31+HU2iswtNP72vXex9wFNGEuAYSrIrcABwXEez/TWLJLcH/hg4HqCqflNVv8D+mstWwG2SbAXcFrgc+2sjVXUmcM2M5m59dDBwclXdUFU/ANbS/G3YbMzWX1X1qaq6sZ38GrBr+9z+mv39BfCvwN8BnSer2V+z99fzgWOq6oZ2mava9rHsL5Ppue0CXNYxvb5t0yySLAP+EPg6cJequgKahBu48whDGzdvo/kP9aaONvtrdvcErgbe25bFHJdke+yvWVXVj2lGcH4EXAFsqKpPYX/1olsf+Xdgfn8BfLJ9bn/NIslBwI+r6vwZs+yv2d0b+KMkX0/yxSQPbdvHsr9MpueWWdq8/MksktwO+L/Ai6vq2lHHM66SHAhcVVXnjDqWCbEV8GDgXVX1h8D1WKLQVVvnezCwO3B3YPskfzbaqCaefwfmkOTvacr9PjjdNMtim3V/Jbkt8PfAq2ebPUvbZt1fra2AO9CUj74MOCVJGNP+Mpme23pgt47pXWl+MlWHJFvTJNIfrKqPtM1XJrlbO/9uwFXd1t/MPAo4KMk6mrKhxyX5APZXN+uB9VX19Xb6wzTJtf01u32BH1TV1VX1W+AjwCOxv3rRrY/8O9BFkucABwLPqt9fZ9f+uqV70XzBPb/9v39X4Nwkd8X+6mY98JFqfIPml9ydGNP+Mpme21nAHkl2T7INTdH7qSOOaay03xSPBy6uqn/pmHUq8Jz2+XOAj2/q2MZRVb2iqnatqmU076fPVdWfYX/Nqqp+AlyWZM+26fHARdhf3fwIeHiS27afzcfTnMdgf82vWx+dChySZNskuwN7AN8YQXxjJcl+wMuBg6rqVx2z7K8ZqurbVXXnqlrW/t+/Hnhw+/+b/TW7jwGPA0hyb2Ab4KeMaX9tNeoAxllV3ZjkKOAMmrPiT6iqC0cc1rh5FPBs4NtJzmvbXgkcQ/OzzOE0f+CfMZrwJob91d0LgA+2X2gvBQ6jGQiwv2aoqq8n+TBwLs1P79+kuXvY7bC/bpbkJGAfYKck64HX0OUzWFUXJjmF5kvcjcBfV9XvRhL4iHTpr1cA2wKfbr638bWqOtL+mr2/qur42Za1v7q+v04ATmgvl/cb4Dntrx9j2V/eAVGSJEkakGUekiRJ0oBMpiVJkqQBmUxLkiRJAzKZliRJkgZkMi1JkiQNyGRa0lhLUkne2jH90iRHL9K2T0zyJ4uxrXn284wkFyf5/LD3NYnaa8Z+Jsl5SZ65iff9lCR7dUy/Lsm+mzIGSZPNZFrSuLsBeFqSnUYdSKckW/ax+OHAX1XVY4cVz3z6jHdT+0Ng66p6UFX91ybe91OAm5Ppqnp1VX1mE8cgaYKZTEsadzfS3Hjkb2bOmDmynOSX7b/7JPliklOSfDfJMUmeleQbSb6d5F4dm9k3yZfa5Q5s198yyZuTnJXkW0n+smO7n0/yIeDbs8RzaLv9C5K8qW17NfBo4N1J3jxj+bT7uaBd75kd8/6ubTs/yTFt2/J2BPf8JOcmuVcb0yc61ntHkue2z9cleXWS/wWekeSJSb7arvvfSW7Xsdxr2/ZvJ7lP2367JO9t276V5Olte7ftHJPkonbZt8zSP3dM8rF2/teSPDDJnYEPAA9qR6bvNWOdh7TH+9Xpvmrbn5vkHR3LfSLJPv3El+SRwEHAm6f33fmeSvL4JN9sj/+EJNvO1V+SNk8m05ImwbHAs5Is6WOdPwBeBDyA5i6d966qvYHjaO6qOG0Z8BjgAJqEdzuakeQNVfVQ4KHAEWluXQuwN/D3VbVXxzZIcnfgTTS3wH0Q8NAkT6mq1wFnA8+qqpfNiPFp7bJ/AOxLk9TdLcn+NCOmD6uqPwD+uV3+g8CxbdsjgSt66IdfV9Wjgc8ArwL2raoHtzH9bcdyP23b3wW8tG37h7YfHlBVDwQ+l+YXgltsJ8kdgacC92uXfcMssbwW+GY7/5XAf1bVVcDzgC+1I9Pfn7HOe4EXVtUjejhW+omvqr5Cc3vil83cd/s+OBF4ZlU9gOaOwc+fp78kbYZMpiWNvaq6FvhP4IV9rHZWVV1RVTcA3wc+1bZ/myaBnnZKVd1UVd+juV35fYAnAn+e5Dzg68CdgD3a5b9RVT+YZX8PBb5QVVdX1Y00ie8fzxPjo4GTqup3VXUl8MV2O/sC762qXwFU1TVJdgB2qaqPtm2/np4/j+myiYfTlDN8uT2u5wD36FjuI+2/5/D7/tmX5osM7T5/Psd2rgV+DRyX5GnAbLE9Gnh/u63PAXea6wtSO2/Hqvpi2/T+eY92YfF12hP4QVV9t51+Hxu/nrP1l6TN0FajDkCSevQ24FyakcppN9IOCiQJsE3HvBs6nt/UMX0TG//fVzP2U0CAF1TVGZ0z2jKC67vEl3ni72edzBJXt2Vv7oPWdjPmT8cb4NNVdWiX7Uz3z+/4ff90i2PW7STZG3g8cAhwFM0o/XzHMHP7M5fvNr/bcS8kvvli7TRbf0naDDkyLWkiVNU1wCk0JRjT1gEPaZ8fDGw9wKafkWSLtlb3nsAlwBnA85NsDZDk3km2n2c7Xwcek2SnNCf7HUoz0jyXM4FnpqnR3plm5PMbNKPof5Hktu3+79iOzq9P8pS2bdt2/g+BvdrpJTTJ4my+BjwqyfJ2/dsmufc88X2KJumkXecO3bbT1iUvqarTgRfTlK/MdrzPatfbh6ZU4tpuO6+qXwAbkjy6bXpWx+x1NHXWWyTZjab8putxzhHfdcAOs+z+O8Cy6e3QlArN93pK2gz5bVrSJHkrHckd8B7g40m+AXyW7qPGc7mEJkm6C3BkVf06yXE0P92f2454X01Tw9xVVV2R5BXA52lGNU+vqo/Ps++PAo8AzqcZgf27qvoJ8D9JHgScneQ3wOk0NcbPBv4jyeuA3wLPqKpLk5wCfAv4HvDNLvFdnebExJOmT6SjqS3+7mzLt94AHNue9Pc74LVV9ZEu27mO5rXYrj3+W5wwChwNvDfJt2jKLJ4zV+e0DgNOSPIrmi85074M/ICmbOcCml8t5jrObvGdDLwnyQuBm09mbd8HhwH/nWQr4Czg3T3EK2kzk6q5fmGTJGk8JFkGfKKq7j/qWCRpmmUekiRJ0oAcmZYkSZIG5Mi0JEmSNCCTaUmSJGlAJtOSJEnSgEymJUmSpAGZTEuSJEkDMpmWJEmSBvT/AZa6SPwU6tDEAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 864x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "plt.figure(figsize=(12, 5))\n",
    "plt.hist(df_ques.question.value_counts(), bins=50)\n",
    "plt.yscale('log', nonposy='clip')\n",
    "plt.title('Log-Histogram of question appearance counts')\n",
    "plt.xlabel('Number of occurences of question')\n",
    "plt.ylabel('Number of questions')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0c1bd94f",
   "metadata": {},
   "source": [
    "## 2 文本分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "f6c5a83d",
   "metadata": {},
   "outputs": [],
   "source": [
    "train_qs = pd.Series(df_train['question1'].tolist() + df_train['question2'].tolist()).astype(str)\n",
    "test_qs = pd.Series(df_test['question1'].tolist() + df_test['question2'].tolist()).astype(str)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "402b22ce",
   "metadata": {},
   "outputs": [],
   "source": [
    "dist_train = train_qs.apply(len)\n",
    "dist_test = test_qs.apply(len)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "86c980e6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "mean-train 59.82 std-train 31.96 mean-test 60.07 std-test 31.62 max-train 1169.00 max-test 1176.00\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA4oAAAJjCAYAAABKse8GAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABFd0lEQVR4nO3de7xtZV0v/s9XRIHUIBBEUCEPlh52oiJqWkknVLQjmWlew+yEsvX8tIsJdVK0Y5Dl9eTGWySWeMkrJiqKkJaabAxF8AIqyRYCRDaCiNfn98cYC+aYe133XmvNdXm/X6/1WnNc53eMOffc87OeZzyjWmsBAACAKbeadAEAAACsLIIiAAAAA4IiAAAAA4IiAAAAA4IiAAAAA4IiAAAAA4IisOiq6oSqalX14WmWvbOqzplAWQtWVQ/tj+PgkXmtqp69DM99cP9cD11IfTOs96aq2ryA535YVT133sWuE1X1gqr6ZlX9pKretJ37mNdrthJU1eOr6mmTrmMSqupPZvu3N7Leqnk9F6qqDquqE6aZf0JVfWsCJQHLTFAEltLDqur+ky5ikT0oyT9NuogF+oskT1vA+g9L8twlqWSVqqpDk7woyd8meXC6c7rWPT4Le9+sJX+S5KHzWO+z6T4Tvrqk1UzGYUleOM38NyZ5+DLXAkzArSddALBmfTvJliR/luQ3FnvnVbVra+17i73fubTWPr3cz7mjWmsr/ktsVe2c5CettR9PupYZ/Hz/+zWtte9MtJJZVNUurbWbJl3HuKqqJLddibXtiP69sOo+E3ZEa21Lus92YI3ToggslZbkL5M8uqo2zLZiVR1SVWdV1Y1VdW1VvaWq9hlZfkDfvevJVfXmqtqa5P0j859QVX9fVd+pqi1V9ZR+uz+pqsur6uqq+ququtXIPn++qt5WVZf1z3thVT13dJ0Zah10Pa2qh1TVJ/rn/k5VnV9Vjxvb5n/1+/9+Vf1nVf3JNPvd2Nfy3ap6f5J9Zz27Q3tV1T9V1Q1V9bWq2ji270HX06ravare2J+bm6rqG1X1hn7ZCUn+KMnd+mNto90s++6IF/THcllVvaSqbj32fA+tqs/3+z6378L2rdFubFV1Tt8N+Ziq+mqSm5LceT6vy0h3v/9RVe/rz9nFfZfZnarqr/vn+2ZV/eFcJ6/f5oT+PHy/f84njZ6/JP/QT15Xc3cJ/oWqen9Vbe1fk89U1RFjq831mj2oqk7vX6Pv9u+rJ4+t87S+lsP68/m9JM/rl53Uv0439P8m3lJVd5qm1t/v17upqq7sX5Of7o/5sUl+ZeR9cMLIdkdV1eZ+u/+qqpdWF/anlp/QvwYPqapz072+jxt//vmes6o6sKreW92/sev7df/byPKpz4JfH9vv+Ht/qq77VNWn+/fYf1TVL42sc2mSPZO8cOTYHzpD3TN1T39OVf1ldZ89V1XVa6rqtjMd/8i2g8+Bqjpi9Pnne5z9vIOr6gP9+bq+f7/daWT5zlX1NyPv+8ur6j1VdZvquhz/v5HjadVfMlDTdD2d6/WZ73mpWT6bgOWnRRFYSv+UrrvenyV5wnQrVNUdk5yT5ItJnpTkdklOSvKRqjq0tfaDkdX/Jsm7033hHG15+qskb0n3xfbpSU6tqvskuVs/fb8k/zfJfyR5W7/Nfkm+3G93fZJD+lp3TXLifA6uqu6Q5J+TvC/Ji5NUkg1Jdh9Z53npAvNL++O8X5K/qKobW2t/269zVJLXJHltkvcm+ZUkp8ynht4bkpya5PVJnpjkNVW1ubX2mRnWf3mSX0zyB0n+K8ldkvxyv+yNSQ5K8qtJHtPPu7qv82FJ3p7kzekCyS+k64K5Z5Jn9uvsl+SMJJ9M8qdJ7pTuHO86TR0PTnL3JM9PcmOS65LcI/N/XV7X/7wmXVfBd/bbVbr30qOSvKyqPjlHS/CL++1flOTcdO+jt1RVa629tT/Gy5L8n/68fC/JRdPtqKp+Psm/9cfwzCTXJDk03TkeNddrdrd+P69NF7IenOTvq+onfU2j3prk5L7+rf28vdO97y5Pcsd04f9jVbVhqtW2qv5Pf+yb0r2eu/Xn7Hb9Md813Xt5KsRu6bd7fP+cr0v3Gt893WtzqyR/PFLXbv0xvjTJV/paFnzO+iBxVpIfJvn9JD/qj/Vf+uP59nT7ncVUXa9I9/5/YZL3VNVdW2s3pnvfn53u/fTGfptpX+9Z/FGSjyV5Srp/Jycm+c9052Jai/A5MLqv/5bunG5O8tQkO6V7Td9fVYe11lqS45M8OclxSb6e7t/qI/t1P5DkZf1xPKjf7bQt6Qt8feY6L7N9NgHLrbXmx48fP4v6k+SEJN/qHz8tXai7Rz/9ziTnjKx7Urovt3cYmXdYuhbJJ/bTB/TT7xl7nqn5fz8y7w7pvrBcnGSnkfmfSfL2GeqtdH84+9MkXxuZ/9B+/wePzGtJnt0/PrSfvv0M+71DkhuSvHBs/ovTfQnaaaS2D46t84Z+3w+d5TxP1ffikXk7pwt2J43Me1OSzSPTX0jyv2fZ798kuXSa+Z9OcvbYvD/pX9/9++m/TvKtJLuOrPP4vs4TRuadky5w3WmWOuZ6XV44Mu9e/byPjcy7VX+e/2qW5/iZJN+d5jU6I8mXR6af1u//dnO899+aLlDtOsPyeb1mM5yH140d31RNz5mjpp3S/WGkJfnlft7u6cL5y2fZbvBvdaSW/8zIv7l+/tP713PPfvqE/vmOmq22eZ6zZ6YLHz87Mm//JD9Icnw/fUD/fL8+tu34e3+qrl8dmXdIP+8RI/O+Nfp+nce/wfHPiI+PrffeJJ+eY19zfg4s4Dj/IV3wvs3IvIPS/Vt9VD/9z0leNks9z07Sppl/QvrP9/m+PvM9L5njs8mPHz/L+6PrKbDU/jHJN9L99Xo6hyU5s41c99W6VpVLkzxkbN0PzLCPs0a2/U66L93/0obXu12S7styku5arqp6UVVdkuT76cLlS5IcWGNdKWfx1XRB8LTquuLtPrb8QUl+Ksk/VdWtp37S/UV9nyT7V9VOSe6TrlVy1LvnWUOSnDn1oLU2FZL3n2X985M8r+/mdo/5PEFf532z7UA+b08XyKZaHe6f5CNteP3o6TPs9rzW2n+NPc9CXpezRh5f0v/+2NSM1tpPknwtI6/7NA5O18I03XHdo6r2nmXb6fxquj9IzHX97KyvWVXtUVWvrqr/THcOfpjkmHQtruO2+XdRVUdW1Ser6rp0X+Knrimb2v5B6Vpp/35eR3WLe6RraXzHNO/pXdKdz5sPLckH57HPuc7ZYUk+21r72s077q6T+7ds+xkxHz9M94eKKVOthbP9m1moM8emL5pt/4v0OTDq15K8J8lPRl6jr6f7XD20X+f8JE+rrov+L1RVbedzLeT1meu8nJ8FfjYBS0dQBJZUa+1H6boVPaWq7jbNKvsmuXKa+Vema+0ZnzedrWPTP5hh3i4j03+Vrpvc69N1t7p/uu6pGVtvRq21a9ONELpzknckubq/Juhn+1X26n9fmFu+7P8wXbe2pOtWdcd0rUVXje1+fHo2W8emx4913LPT/SX/BUm+XN31fdN2DR6xV7rjHH8NpqanXqs7pe+qOqV1A5jcMM0+p3s9F/K6bB15jh+Mz+vNdS6mrgWd6bj2mGXb6eyZ5Ip5rLd1bHq8zjcl+e10LbQPS3ceTsn0xzKovbqRhk9PFw6fmi4UPrBfPLX9nv3v+dQ6auo9fUaG7+mv9/NHu9he24Zdx2cy1zlbyGfEfHyn/yNCksF7Z17/7udp69j0XO/DxfgcGLVXui7dPxz7+dnc8hr933RdXTcm+VySy6rqOdvxXAt5fbaOTY+fl+35bAKWiGsUgeVwSrrru54/zbIr0l1PNW6fJOeNzWuLWNPjkvy/1trN1wxV1aMWupPW2qeSPKKqdk33V/yXJzkt3RfzqWtzfj3Tf5H6crrufz/KtudgoS1Z89Za25rk/0vy/1XVL6TrPvqWqvp8a22ma7G+le6L5nhdU4MOTR3rf6X70nuzqtol3XVv25QyzbxFeV0WYCqg7J3u2rgp48c1X9dkYQMRbaM/X49K18X5tSPzZ/rj7vh5fEy6sP7brbXWbzv+R5qpY9033Ws7X1Pn45h01/yO+/rI4/n+e53rnF2R5L9PM3+fkXqmRlO9zdg62xMkJ+HqzO9zYL7H+e10LYpvzLa+ldz8B5wXJHlBVR2UrgvpK6vqy621Dy2g9vm8PvOynZ9NwBLRoggsudba99Nd9/b0bPuF8N+TPLyqbj81o28ROSDJvy5hWbum69o49Zw7ZYYBd+ajtfa91tr704Xie/WzP5Xuuq07t9Y2T/Nzfd899vwkR43t8je3t5YF1v35dAOZ3Cq33AJim9aPvs7zsu3IlY9P8pN0x5p0g8Ec0QfnKY9eQEmL+rrMwxfShfXpjusrrbWrt91kVmcleXwf9rbXbdNdVzh6Hm6f+Z/HXZP8cCok9p48ts7Ue/PoWfYzXSvYl5N8M8kBM7ynr9l2N3Oa65z9e5L7VdWBUzP6QZN+Mbd8RlyV7g8Z9xxZ53a5pUv0Qs3VArioFvA5MN/jPCtdN+DzpnmNLp3m+S9O15L//dzy+fWDfv9znYf5vD4LNsNnE7CMtCgCy2VqhMRfTPIvI/NfnuTYJB+uqr/KLaOeXpDkXUtYz0eSPKu/Fu7bSZ6V7gv6vPUtXU9P11XqG+muhXtG+uvkWmtbq7ulwKv6Fp2Pp/vSc48kh7fWpkYV/csk766qk9O1AvxKkkfsyMHNUfe/9s/zhXStPr+fbkCXqRE3v5Rkn+qGyP9CuoErLk03OuSHq+rv040euyHdSIpv6K9JSpJXpjuX76+qV6TrinpcujB2c3e/Wezw67IQrbVvV9Urk/yfqvpRulEifzNdt9cnbscup0ZO/XhVvSxda9l9klzTWpvXCJatteuqu6XEC6rqO+nO23HpRoW9wzx28ZEkz+2P6/3p/s09Zew5tlbVXyR5SVXdJl1X0tuma8l8UWvtm+neB0dV1W+k68Z6eWvt8qr6oyT/0I/6+8F0geJn090v9bdaN3LoQsx1zt6UrjfCB6vqBekGZDkhXcvY6/rj+UlVvS/JH/TXdW5NN8Lm9t5r9UtJHlVVH0rXbfrLrbXrt3Nf8zXn58ACjvOEdP+eP1BVp6Q7V/slOSLJm1pr51TVe9L98ec/+u1/K933wo/3+/hS//s5VfWxdF12vzxN3W/KHK/PfM3jswlYRloUgWXRf3l8xTTzr05yeLouVW9Nd83MJ5IcMc/rm7bX/+6f5zXpWgG/kHneFmPEJbnlfpFnprsW80PpwmOSpO9CeUySI9MNVPHWdK07nxhZ5z19Pf8zXei8T5LfW/ghzdun0o2Y+c5011buleTIkbD3jnRf/l6a7gv8CX2dZ6Zr3Ts0XQB5broh9G++r2QfMB6Vrsvcu9Md19PTtZDN50b1i/G6LNQL+uc4Nt1IkL+c5CmttbfNutU0+i/SD0n3JfmN6b70/la6kUIX4knpunG+Ocmr0v3R5M3zrOGMdF/cH5vuWsVfSdf9eXy9qWP+tXTvzdelGw11KhBtSve+PiXd++CYfru3p2v5OiTdIEDvTned22fTt0ItxFznrO+R8Gvpgsvfpbu1xX+mGwl0tGvjs9MNoLIp3fvnrRkZ3GiBnpcuoHwg3bHfbzv3M28L+ByY8zhba19J1/39xnTX+34wXSD/fm4Z+OmT6cL9aele//sleWxrbep+jJ9Id43sc9K1Gk4b+hbw+szHXJ9NwDKqYc8UAFhcVfWQdF86f7W1dvZc6wOdqjo4Xe+Kw1tr50y4HGCd0fUUgEXVdyH+j3QD2/xckj9P8vkMuxwDACuYoAjAYrttui5r+6Trxnhmkj8cvSUBALCy6XoKAADAgMFsAAAAGFi3XU/32muvdsABB0y6DAAAgIk477zzvtVau+N0y9ZtUDzggAOyefPmuVcEAABYg/p7sk5L11MAAAAGBEUAAAAGBEUAAAAG1u01igAAwPr2wx/+MFu2bMlNN9006VKW1C677JL9998/O++887y3ERQBAIB1acuWLbn97W+fAw44IFU16XKWRGst11xzTbZs2ZIDDzxw3tvpegoAAKxLN910U/bcc881GxKTpKqy5557LrjVVFAEAADWrbUcEqdszzEKigAAAAy4RhEAACDJhlM3LOr+Ljj6glmXb926Naeddlo2bty4oP0+8pGPzGmnnZbdd999B6qbnRZFAACACdi6dWs2bdq0zfwf//jHs253xhlnLGlITLQoAgAATMRxxx2Xr371qznkkEOy884753a3u1323XffnH/++bnooovyG7/xG7nsssty00035TnPeU6OOeaYJMkBBxyQzZs354YbbsiRRx6ZhzzkIfnkJz+Z/fbbL+973/uy66677nBtWhQBAAAm4KSTTsrd7373nH/++fnrv/7rfOYzn8lLXvKSXHTRRUmSU045Jeedd142b96cV7/61bnmmmu22cfFF1+cZz3rWbnwwguz++67513vetei1KZFEQAAYAU47LDDBvc6fPWrX533vOc9SZLLLrssF198cfbcc8/BNgceeGAOOeSQJMn97ne/XHrppYtSi6AIAACwAvzUT/3UzY/POeecfPSjH82nPvWp7LbbbnnoQx867b0Qb3vb2978eKeddsr3vve9RalF11MAAIAJuP3tb5/rr79+2mXXXXdd9thjj+y222750pe+lE9/+tPLWpsWRQAAgMx9O4vFtueee+bBD35wDj744Oy6667ZZ599bl72iEc8Iq997WvzC7/wC/m5n/u5PPCBD1zW2qq1tqxPuFIceuihbfPmzZMuAwAAmJAvfvGLuec97znpMpbFdMdaVee11g6dbn1dTwEAABgQFAEAABgQFAEAABgQFAEAABgQFAEAABgQFAEAABhwH0UAAIAkOfvExd3f4cfPunjr1q057bTTsnHjxgXv+pWvfGWOOeaY7Lbbbttb3ay0KALzsuHUDYMfAAB2zNatW7Np06bt2vaVr3xlbrzxxkWu6BZaFAEAACbguOOOy1e/+tUccsghOeKII7L33nvnHe94R77//e/nMY95TF70ohflu9/9bh7/+Mdny5Yt+fGPf5w///M/z5VXXpnLL788hx9+ePbaa6+cffbZi16boAgAADABJ510Ur7whS/k/PPPz5lnnpl3vvOd+cxnPpPW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p4xtu2e2b+TWvfpafjj287uZ4/z34fhh6V6rdyS5uqo+0LcaA7AEdD0FYDGckq6b5/OnWXZTxkJdTT8YzY7ae5rpHyX5Vrqg05KckOSMaba9fGy6TbPOuCumec4k2Sddy9lCXJPkp6rqDvMIi7N5TJKrk/x2a60l3cAzM6w7OMbqRnd9VLruna8dmT/+R+Vr0oXkhfp2ks3prkscNz4S7Dbnv7X2qSSPqG4U1F9L8vIkp+WWIAzAItKiCMAO62/58DdJnp5tQ8SWJLevqv1G5j1sCcp4zDTT57XWftxa+26STyf5udba5ml+xoPifPx7koePjZp6/3T3D/zXBe7rY/3v39mOOkbtmuSHUyGxt82opTO4bbpW15tDW39sjx5b76x0x73PDPsZtHKObfffknxjmvN/Qeaptfa91tr70/1x4l7z3Q6AhdGiCMBieV2SP03yi+muO5vyoSTfS3JKVb0syYHZdiCaxXBkVb2kf+7fTHJEkqNGlv9JuoFrfpLknUmuT3LXdK1of7YdA/G8PF3r2Ier6q9yy6inFyR510J21Fr7clW9PsnL+lFFP55uRM/faq0tZDTZjyR5blW9Msn7070WT5lnDddV1blJXlBV30nykyTHJbku3SA6U16RLtB+oj/flyW5Z5Kfaq29NN31qt9LcnR/neQPW2ubk7w53et+TlX9TZKvpevGeli6wWteMVNtVfWodH+EeG+///2SPCO3BGwAFpkWRQAWRWvtxnQhYnz+t5I8Nt3ome9NF1yetAQl/K8k9+2f49eTPKu1dvpIHf+a7jYbd0x3G433pwuPl2V+1yQOtNauTjcIzU3pRgR9TZJPJDmitfaD2badwcZ0t+N4Srrusa9MF7gWUtMZ6br/PjbdtYq/ku5czNeTknw9Xah7VbrA++ax57g63Qiq/9HX+M/pBrz5Rr/8pnSjpN4vXWg/d2T+4enC7IvSjVr6qiQHpbslymwuyS337Twz3TWxH0oXHgFYAjXsnQIAAMB6p0URAACAAUERAACAAUERAACAAUERAACAAUERAACAAUERAACAAUERAACAAUERAACAgf8fkie9DfFTXL0AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 1080x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import seaborn as sns\n",
    "\n",
    "pal = sns.color_palette()\n",
    "\n",
    "plt.figure(figsize=(15, 10))\n",
    "plt.hist(dist_train, bins=200, range=[0, 200], color=pal[2], density=True, label='train')\n",
    "plt.hist(dist_test, bins=200, range=[0, 200], color=pal[1], density=True, alpha=0.5, label='test')\n",
    "plt.title('Normalised histogram of character count in questions', fontsize=15)\n",
    "plt.legend()\n",
    "plt.xlabel('Number of characters', fontsize=15)\n",
    "plt.ylabel('Probability', fontsize=15)\n",
    "\n",
    "print('mean-train {:.2f} std-train {:.2f} mean-test {:.2f} std-test {:.2f} max-train {:.2f} max-test {:.2f}'.format(dist_train.mean(), \n",
    "                          dist_train.std(), dist_test.mean(), dist_test.std(), dist_train.max(), dist_test.max()))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6440f897",
   "metadata": {},
   "source": [
    "我们可以看到，大多数问题都有15到150个字符。似乎测试分布与训练分布有点不同，但不是太大（我不知道它是否只是减少噪声的较大数据，但似乎分布在测试集中要平滑得多）。  \n",
    "有一件事吸引了我的眼球，那就是对于大多数问题来说，训练集在150个字符处有一个陡峭的截止线，而测试集在150个字符后会慢慢减少。这可能是某种Quora问题的大小限制吗？  \n",
    "另外值得注意的是，我已经将这个直方图截断为200个字符，并且对于这两个集合，分布的最大值都略低于1200个字符——尽管超过200个字符的样本非常罕见。\n",
    "让我们做同样的字数计算。我将使用一种简单的方法来拆分单词（在空格上拆分，而不是使用一个严肃的标记器），尽管这仍然会让我们对分布有一个很好的了解。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "90ee582e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "mean-train 11.06 std-train 5.89 mean-test 11.02 std-test 5.84 max-train 237.00 max-test 238.00\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1080x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "dist_train = train_qs.apply(lambda x: len(x.split(' ')))\n",
    "dist_test = test_qs.apply(lambda x: len(x.split(' ')))\n",
    "\n",
    "plt.figure(figsize=(15, 10))\n",
    "plt.hist(dist_train, bins=50, range=[0, 50], color=pal[2], density=True, label='train')\n",
    "plt.hist(dist_test, bins=50, range=[0, 50], color=pal[1], density=True, alpha=0.5, label='test')\n",
    "plt.title('Normalised histogram of word count in questions', fontsize=15)\n",
    "plt.legend()\n",
    "plt.xlabel('Number of words', fontsize=15)\n",
    "plt.ylabel('Probability', fontsize=15)\n",
    "\n",
    "print('mean-train {:.2f} std-train {:.2f} mean-test {:.2f} std-test {:.2f} max-train {:.2f} max-test {:.2f}'.format(dist_train.mean(), \n",
    "                          dist_train.std(), dist_test.mean(), dist_test.std(), dist_train.max(), dist_test.max()))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "64d64cdb",
   "metadata": {},
   "source": [
    "我们在字数上看到了类似的分布，大多数问题的长度都在10个字左右。在我看来，训练集的分布似乎更“尖锐”，而在测试集上则更为广泛。然而，它们非常相似。  \n",
    "那么最常见的词是什么呢？让我们来看看单词云。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "92783195",
   "metadata": {},
   "source": [
    "## 3 语义分析\n",
    "接下来，我将看一看不同标点符号在问句中的用法——这可能会为以后的一些有趣的特性奠定基础。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "30ba0735",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Questions with question marks: 99.87%\n",
      "Questions with [math] tags: 0.12%\n",
      "Questions with full stops: 6.31%\n",
      "Questions with capitalised first letters: 99.81%\n",
      "Questions with capital letters: 99.95%\n",
      "Questions with numbers: 11.83%\n"
     ]
    }
   ],
   "source": [
    "qmarks = np.mean(train_qs.apply(lambda x: '?' in x))\n",
    "math = np.mean(train_qs.apply(lambda x: '[math]' in x))\n",
    "fullstop = np.mean(train_qs.apply(lambda x: '.' in x))\n",
    "capital_first = np.mean(train_qs.apply(lambda x: x[0].isupper()))\n",
    "capitals = np.mean(train_qs.apply(lambda x: max([y.isupper() for y in x])))\n",
    "numbers = np.mean(train_qs.apply(lambda x: max([y.isdigit() for y in x])))\n",
    "\n",
    "print('Questions with question marks: {:.2f}%'.format(qmarks * 100))\n",
    "print('Questions with [math] tags: {:.2f}%'.format(math * 100))\n",
    "print('Questions with full stops: {:.2f}%'.format(fullstop * 100))\n",
    "print('Questions with capitalised first letters: {:.2f}%'.format(capital_first * 100))\n",
    "print('Questions with capital letters: {:.2f}%'.format(capitals * 100))\n",
    "print('Questions with numbers: {:.2f}%'.format(numbers * 100))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "786c0913",
   "metadata": {},
   "source": [
    "## 4 初始特征分析\n",
    "在创建模型之前，我们应该先看看一些功能有多强大。我将从基准模型的wordshare特性开始。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "2d790209",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 0, 'word_match_share')"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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NtxwQ9ra2oiIRoejEiklli5dyuLFixk5cmRNxzgFUZIkSRrAli9fzqabbmryNQBFBJtuummvRidNwCRJkqQBzuRr4OrtvTEBkyRJktSjiODEE09ctX3uuecyderUHo+57rrrWLBgQcX3pk6dyhZbbMHYsWPZcsst2X///bstW4tFixYxatQoADo6OjjuuOP6VM8FF1zAa6+91uc4auEzYJIkSVITaTt1Vr/Wt+jsvauWWW+99bjmmmv42te+xmabbVZTvddddx377LMPW2+9dcX3v/KVr3DSSScBMGPGDCZNmsT8+fMZNmxY7cFX0N7eTnt7e5+OveCCCzj00EN5+9vfvkYx9MQRMEmSJEk9Gjx4MEcffTTnn3/+au899dRT7LbbbowePZrddtuNp59+mt/97nfccMMNnHzyyYwdO5Y//vGPPdY/efJkdt99d6ZPnw5AW1sbS5YsAbIRrQkTJgDZyNlhhx3GpEmT2HLLLfnJT36yWl2zZ89mn332AWDZsmUceeSRfPSjH2X06NHMnDkTgC9/+cu0t7ezzTbbcPrppwPwwx/+kGeeeYaJEycyceJEAG6++WZ22GEHxo8fzwEHHMCyZcv6cPXeqqYELCIWRcT8iJgbER1rfFZJkiRJTeXYY4/l8ssv56WXXnrL/ilTpnD44Yczb948DjnkEI477jh23HFH9t13X8455xzmzp3LBz/4war1jx8/nkceeaRquXnz5jFr1izuuecezjzzTJ555pluy377299mo402Yv78+cybN49JkyYBcNZZZ9HR0cG8efO44447mDdvHscddxzvec97uP3227n99ttZsmQJ3/nOd7j11lt58MEHaW9v57zzzqsaXzW9mYI4MaW0ZI3P2ED9PVzbX2oZ9pUkSZIa6R3veAeHH344P/zhDxk6dOiq/ffccw/XXHMNAIcddhinnHJKn+pPKdVUbr/99mPo0KEMHTqUiRMncv/99zN27NiKZW+99VauvPLKVdsbb7wxAL/4xS+YNm0ab775Js8++ywLFixg9OjRbzn23nvvZcGCBey0004AvPHGG+ywww59aNlb+QyYJEmSpJqccMIJjB8/niOPPLLbMn1dsfGhhx5a9ezW4MGDWblyJcBqS7yX19/T+VJKq73/5JNPcu655/LAAw+w8cYb8/nPf77iMvIpJT71qU9xxRVX9Kk93an1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\n",
      "text/plain": [
       "<Figure size 1080x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from nltk.corpus import stopwords\n",
    "\n",
    "stops = set(stopwords.words(\"english\"))\n",
    "\n",
    "def word_match_share(row):\n",
    "    q1words = {}\n",
    "    q2words = {}\n",
    "    for word in str(row['question1']).lower().split():\n",
    "        if word not in stops:\n",
    "            q1words[word] = 1\n",
    "    for word in str(row['question2']).lower().split():\n",
    "        if word not in stops:\n",
    "            q2words[word] = 1\n",
    "    if len(q1words) == 0 or len(q2words) == 0:\n",
    "        # The computer-generated chaff includes a few questions that are nothing but stopwords\n",
    "        return 0\n",
    "    shared_words_in_q1 = [w for w in q1words.keys() if w in q2words]\n",
    "    shared_words_in_q2 = [w for w in q2words.keys() if w in q1words]\n",
    "    R = (len(shared_words_in_q1) + len(shared_words_in_q2))/(len(q1words) + len(q2words))\n",
    "    return R\n",
    "\n",
    "plt.figure(figsize=(15, 5))\n",
    "train_word_match = df_train.apply(word_match_share, axis=1)\n",
    "plt.hist(train_word_match[df_train['is_duplicate'] == 0], bins=20, density=True, label='Not Duplicate')\n",
    "plt.hist(train_word_match[df_train['is_duplicate'] == 1], bins=20, density=True, alpha=0.7, label='Duplicate')\n",
    "plt.legend()\n",
    "plt.title('Label distribution over word_match_share', fontsize=15)\n",
    "plt.xlabel('word_match_share', fontsize=15)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "edc89d91",
   "metadata": {},
   "source": [
    "在这里我们可以看到，这个特性有相当大的预测能力，因为它善于区分重复问题和非重复问题。有趣的是，它似乎很善于识别那些完全不同的问题，但却不善于发现那些完全重复的问题。\n",
    "\n",
    "## 5 TF-IDF\n",
    "\n",
    "我现在将尝试通过使用TF-IDF（term frequency inverse document frequency）来改进这个特性。这意味着，我们衡量术语的标准是它们有多不常见，这意味着我们更关心两个问题中存在的稀有词，而不是普通词。这是有道理的，例如我们更关心的是“exercise”一词是否同时出现在这两个词中，而不是“and”一词，因为不常见的词更能表示内容。\n",
    "\n",
    "如果您是自己实现的，您可能想研究使用sklearn的TfidfVectorizer来计算权重，但是由于我懒得阅读文档，因此我将使用纯python编写一个版本，并进行一些更改，我相信这些更改将有助于评分。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "bb342751",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Most common words and weights: \n",
      "\n",
      "[('the', 2.5891040146646852e-06), ('what', 3.115623919267953e-06), ('is', 3.5861702928825277e-06), ('how', 4.366449945201053e-06), ('i', 4.4805878531263305e-06), ('a', 4.540645588989843e-06), ('to', 4.671434644293609e-06), ('in', 4.884625153865692e-06), ('of', 5.920242493132519e-06), ('do', 6.070908207867897e-06)]\n",
      "\n",
      "Least common words and weights: \n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[('シ', 9.998000399920016e-05),\n",
       " ('し?', 9.998000399920016e-05),\n",
       " ('19-year-old.', 9.998000399920016e-05),\n",
       " ('1-855-425-3768', 9.998000399920016e-05),\n",
       " ('confederates', 9.998000399920016e-05),\n",
       " ('asahi', 9.998000399920016e-05),\n",
       " ('fab', 9.998000399920016e-05),\n",
       " ('109?', 9.998000399920016e-05),\n",
       " ('samrudi', 9.998000399920016e-05),\n",
       " ('fulfill?', 9.998000399920016e-05)]"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from collections import Counter\n",
    "\n",
    "# If a word appears only once, we ignore it completely (likely a typo)\n",
    "# Epsilon defines a smoothing constant, which makes the effect of extremely rare words smaller\n",
    "def get_weight(count, eps=10000, min_count=2):\n",
    "    if count < min_count:\n",
    "        return 0\n",
    "    else:\n",
    "        return 1 / (count + eps)\n",
    "\n",
    "eps = 5000 \n",
    "words = (\" \".join(train_qs)).lower().split()\n",
    "counts = Counter(words)\n",
    "weights = {word: get_weight(count) for word, count in counts.items()}\n",
    "\n",
    "print('Most common words and weights: \\n')\n",
    "print(sorted(weights.items(), key=lambda x: x[1] if x[1] > 0 else 9999)[:10])\n",
    "print('\\nLeast common words and weights: ')\n",
    "(sorted(weights.items(), key=lambda x: x[1], reverse=True)[:10])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "105dac71",
   "metadata": {},
   "outputs": [],
   "source": [
    "def tfidf_word_match_share(row):\n",
    "    q1words = {}\n",
    "    q2words = {}\n",
    "    for word in str(row['question1']).lower().split():\n",
    "        if word not in stops:\n",
    "            q1words[word] = 1\n",
    "    for word in str(row['question2']).lower().split():\n",
    "        if word not in stops:\n",
    "            q2words[word] = 1\n",
    "    if len(q1words) == 0 or len(q2words) == 0:\n",
    "        # The computer-generated chaff includes a few questions that are nothing but stopwords\n",
    "        return 0\n",
    "    \n",
    "    shared_weights = [weights.get(w, 0) for w in q1words.keys() if w in q2words] + [weights.get(w, 0) for w in q2words.keys() if w in q1words]\n",
    "    total_weights = [weights.get(w, 0) for w in q1words] + [weights.get(w, 0) for w in q2words]\n",
    "    \n",
    "    R = np.sum(shared_weights) / np.sum(total_weights)\n",
    "    return R"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "a6423914",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "<ipython-input-28-d44aceb8972a>:17: RuntimeWarning: invalid value encountered in double_scalars\n",
      "  R = np.sum(shared_weights) / np.sum(total_weights)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Text(0.5, 0, 'word_match_share')"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1080x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(15, 5))\n",
    "tfidf_train_word_match = df_train.apply(tfidf_word_match_share, axis=1)\n",
    "plt.hist(tfidf_train_word_match[df_train['is_duplicate'] == 0].fillna(0), bins=20, density=True, label='Not Duplicate')\n",
    "plt.hist(tfidf_train_word_match[df_train['is_duplicate'] == 1].fillna(0), bins=20, density=True, alpha=0.7, label='Duplicate')\n",
    "plt.legend()\n",
    "plt.title('Label distribution over tfidf_word_match_share', fontsize=15)\n",
    "plt.xlabel('word_match_share', fontsize=15)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "c4a9e92f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Original AUC: 0.7806345659741539\n",
      "   TFIDF AUC: 0.7706507169086894\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import roc_auc_score\n",
    "print('Original AUC:', roc_auc_score(df_train['is_duplicate'], train_word_match))\n",
    "print('   TFIDF AUC:', roc_auc_score(df_train['is_duplicate'], tfidf_train_word_match.fillna(0)))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "45aba675",
   "metadata": {},
   "source": [
    "所以看起来我们的TF-IDF在整体AUC方面实际上变得更糟了，这有点令人失望(我使用AUC度量，因为它不受缩放和类似的影响，所以它是测试单个特征预测能力的一个很好的度量。\n",
    "\n",
    "但是，我仍然认为这个特性应该提供一些原始特性没有提供的额外信息。我们的下一步工作是将这些特性结合起来，并使用它们进行预测。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "c0b58a2d",
   "metadata": {},
   "outputs": [],
   "source": [
    "import re, string, six\n",
    "\n",
    "from nltk.corpus import stopwords\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "re_tok = re.compile(f'([{string.punctuation}“”¨«»®´·º½¾¿¡§£₤‘’])')# 以 f开头表示在字符串内支持大括号内的python 表达式\n",
    "\n",
    "def tokenize(s): \n",
    "    return re_tok.sub(r' \\1 ', s).split()#去掉反斜杠的转移机制\n",
    "\n",
    "def clean_text(s):\n",
    "    try:\n",
    "        return re.sub(r'[^A-Za-z0-9,?\"\\'. ]+', '', s).encode('utf-8').decode('utf-8').lower()\n",
    "    except:\n",
    "        return \"\"\n",
    "    \n",
    "def word_count_diff(row):\n",
    "    try:\n",
    "        q1words = len(list(filter(lambda x: x.lower() not in stops, tokenize(row['question1']))))\n",
    "        q2words = len(list(filter(lambda x: x.lower() not in stops, tokenize(row['question2']))))\n",
    "        return abs(q1words - q2words)\n",
    "    except:\n",
    "        return 50"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "5c4324ee",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 0, 'word_count_diff')"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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++67r8WZvZQBnCRJkqQN4tRTT2XMmDEcd9xxneZZ2xUz77rrrlX3rvXv35+VK1cCrLZEf3P9azpeZq62/8EHH+Tcc89l1qxZvPa1r+XYY49t+RiAzGTfffflxz/+8VqdT2ecQilJkiRpg9hyyy35wAc+wPe+971VaXvssceqUa4f/ehH7LXXXgBsvvnmPPPMM5XqveKKK7juuus44ogjgOIeuDvvvHPVvkY/+9nPWLp0KUuWLOGmm25i11137bTe/fbbj29+85urtp988kmefvppBg0axBZbbMGjjz7KL37xi1X7G9u822678Zvf/IYFCxYA8Pzzz3P//fdXOp81MYCTJEmStMGcdtppqxYYgWLxj+9///uMHDmS//qv/+JrX/saAIcffjjnnHMOu+yyS8tFTM4///xVjxH47//+b371q1+tWoHyc5/7HKeccgpvf/vb6dev30vKjR07loMPPpjddtuNz3zmM7zhDW/otK2f/vSnefLJJ9l5550ZNWoUN954I6NGjWKXXXZhp5124vjjj181RRJg4sSJHHjggYwbN47BgwczdepUjjjiCEaOHMluu+1W6R69rkTVuaIbUltbW86ePbunm7E674GTJElSzdx77728+c1v7ulmbBQmT57MZpttturxAxuLVn0UEXdm5mrPM3AETpIkSZJqwkVMJEmSJPUJkydP7ukmvGyOwEmSJElSTRjASZIkSVJNGMBJkiRJUk0YwEmSJElSTRjASZIkSVqv+vXrx+jRo9lpp50YNWoU5513HitXrlzr+o499lguv/xyAE444QTmzZvX7TrmzJnDzJkz17oNPcVVKCVJkqS+pMqzjbujwnOQBw4cyJw5cwB47LHH+OAHP8hTTz3F5z//+Zd9+Isvvnitys2ZM4fZs2dz0EEHvew2bEiOwEmSJEnaYLbZZhumTJnCN7/5TTKTqVOnMmnSpFX7DznkEG666SYANttsM0477TTGjBnDPvvsw+LFi1erb++992b27NkAXHPNNYwZM4ZRo0axzz77AHDHHXewxx57sMsuu7DHHnswf/58li1bxmc/+1kuu+wyRo8ezWWXXcZzzz3H8ccfz6677souu+zCz372s/V/MdaCAZwkSZKkDeqNb3wjK1eu5LHHHltjvueee44xY8bw+9//nne+851rHLFbvHgxH/nIR7jiiiv4wx/+wE9/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\n",
      "text/plain": [
       "<Figure size 1080x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(15, 5))\n",
    "train_word_count_diff = df_train.apply(word_count_diff, axis=1)\n",
    "plt.hist(train_word_count_diff[df_train['is_duplicate'] == 0].fillna(0), bins=20, density=True, label='Not Duplicate')\n",
    "plt.hist(train_word_count_diff[df_train['is_duplicate'] == 1].fillna(0), bins=20, density=True, alpha=0.7, label='Duplicate')\n",
    "plt.legend()\n",
    "plt.title('Label distribution over word_count_diff', fontsize=15)\n",
    "plt.xlabel('word_count_diff', fontsize=15)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fb77a45a",
   "metadata": {},
   "source": [
    "## 6 重新平衡数据\n",
    "\n",
    "然而，在我这样做之前，我想重新平衡分类器接收到的数据，因为我们的训练数据中有37%的类是阳性的，而测试数据中只有17%。通过重新平衡数据，使我们的训练集有17%的正概率，我们可以确保分类器输出的概率将更好地匹配排行榜上的数据，并且应该得到更好的分数（因为LogLoss关注的是概率本身，而不仅仅是预测的顺序，如AUC）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "e433f1c7",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "<ipython-input-28-d44aceb8972a>:17: RuntimeWarning: invalid value encountered in double_scalars\n",
      "  R = np.sum(shared_weights) / np.sum(total_weights)\n",
      "<ipython-input-28-d44aceb8972a>:17: RuntimeWarning: invalid value encountered in long_scalars\n",
      "  R = np.sum(shared_weights) / np.sum(total_weights)\n"
     ]
    }
   ],
   "source": [
    "# First we create our training and testing data\n",
    "x_train = pd.DataFrame()\n",
    "x_test = pd.DataFrame()\n",
    "x_train['word_match'] = train_word_match\n",
    "x_train['tfidf_word_match'] = tfidf_train_word_match\n",
    "x_train['word_count_diff'] = train_word_count_diff\n",
    "x_test['word_match'] = df_test.apply(word_match_share, axis=1)\n",
    "x_test['tfidf_word_match'] = df_test.apply(tfidf_word_match_share, axis=1)\n",
    "x_test['word_count_diff'] = df_test.apply(word_count_diff, axis=1)\n",
    "\n",
    "x_train.to_csv(\"train_tfidf.csv\", index=False)\n",
    "x_test.to_csv(\"test_tfidf.csv\", index=False)\n",
    "\n",
    "y_train = df_train['is_duplicate'].values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "b4ab4c32",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.19124366100096607\n"
     ]
    }
   ],
   "source": [
    "pos_train = x_train[y_train == 1]\n",
    "neg_train = x_train[y_train == 0]\n",
    "\n",
    "# Now we oversample the negative class\n",
    "# There is likely a much more elegant way to do this...\n",
    "p = 0.165\n",
    "scale = ((len(pos_train) / (len(pos_train) + len(neg_train))) / p) - 1\n",
    "while scale > 1:\n",
    "    neg_train = pd.concat([neg_train, neg_train])\n",
    "    scale -=1\n",
    "neg_train = pd.concat([neg_train, neg_train[:int(scale * len(neg_train))]])\n",
    "print(len(pos_train) / (len(pos_train) + len(neg_train)))\n",
    "\n",
    "x_train = pd.concat([pos_train, neg_train])\n",
    "y_train = (np.zeros(len(pos_train)) + 1).tolist() + np.zeros(len(neg_train)).tolist()\n",
    "del pos_train, neg_train"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "cb862262",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>word_match</th>\n",
       "      <th>tfidf_word_match</th>\n",
       "      <th>word_count_diff</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>327743</th>\n",
       "      <td>0.571429</td>\n",
       "      <td>0.513630</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>238796</th>\n",
       "      <td>0.533333</td>\n",
       "      <td>0.541054</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        word_match  tfidf_word_match  word_count_diff\n",
       "327743    0.571429          0.513630                1\n",
       "238796    0.533333          0.541054                3"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_train.sample(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "ce92302a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Finally, we split some of the data off for validation\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "x_train, x_valid, y_train, y_valid = train_test_split(x_train, y_train, test_size=0.2, random_state=4242)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5806d3c5",
   "metadata": {},
   "source": [
    "## 7 建模LightGBM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "2cd67d96",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import log_loss\n",
    "import lightgbm as lgb\n",
    "\n",
    "# create dataset for lightgbm\n",
    "lgb_train = lgb.Dataset(x_train, y_train)\n",
    "lgb_eval = lgb.Dataset(x_valid, y_valid, reference=lgb_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "2880cb17",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[LightGBM] [Warning] Auto-choosing col-wise multi-threading, the overhead of testing was 0.025801 seconds.\n",
      "You can set `force_col_wise=true` to remove the overhead.\n",
      "[1]\tvalid_0's binary_logloss: 0.388318\n",
      "Training until validation scores don't improve for 5 rounds\n",
      "[2]\tvalid_0's binary_logloss: 0.368865\n",
      "[3]\tvalid_0's binary_logloss: 0.362288\n",
      "[4]\tvalid_0's binary_logloss: 0.359654\n",
      "[5]\tvalid_0's binary_logloss: 0.358502\n",
      "[6]\tvalid_0's binary_logloss: 0.358299\n",
      "[7]\tvalid_0's binary_logloss: 0.368724\n",
      "[8]\tvalid_0's binary_logloss: 0.358066\n",
      "[9]\tvalid_0's binary_logloss: 0.3613\n",
      "[10]\tvalid_0's binary_logloss: 0.371805\n",
      "[11]\tvalid_0's binary_logloss: 0.362795\n",
      "[12]\tvalid_0's binary_logloss: 0.378177\n",
      "[13]\tvalid_0's binary_logloss: 0.398195\n",
      "Early stopping, best iteration is:\n",
      "[8]\tvalid_0's binary_logloss: 0.358066\n"
     ]
    }
   ],
   "source": [
    "# specify your configurations as a dict\n",
    "params = {'boosting_type': 'gbdt','objective': 'binary','metric': 'binary_logloss',\n",
    "          'num_leaves': 37,'learning_rate': 0.89,'feature_fraction': 0.9,\n",
    "          'bagging_fraction': 0.8,'bagging_freq': 5,'verbose': 0}\n",
    "gbm = lgb.train(params,lgb_train,num_boost_round=20,valid_sets=lgb_eval,\n",
    "                early_stopping_rounds=5)\n",
    "# predict"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "065c094a",
   "metadata": {},
   "outputs": [],
   "source": [
    "y_pred = gbm.predict(x_valid, num_iteration=gbm.best_iteration)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "3e72b7b0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.35806555379680877"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import log_loss\n",
    "log_loss(y_valid,y_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e777fa10",
   "metadata": {},
   "source": [
    "## 8 建模XGBoost"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "c8994253",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0]\ttrain-logloss:0.68269\tvalid-logloss:0.68336\n",
      "[10]\ttrain-logloss:0.60237\tvalid-logloss:0.60239\n",
      "[20]\ttrain-logloss:0.54512\tvalid-logloss:0.54563\n",
      "[30]\ttrain-logloss:0.50332\tvalid-logloss:0.50412\n",
      "[40]\ttrain-logloss:0.47181\tvalid-logloss:0.47313\n",
      "[50]\ttrain-logloss:0.44836\tvalid-logloss:0.44964\n",
      "[60]\ttrain-logloss:0.43011\tvalid-logloss:0.43152\n",
      "[70]\ttrain-logloss:0.41583\tvalid-logloss:0.41757\n",
      "[80]\ttrain-logloss:0.40515\tvalid-logloss:0.40663\n",
      "[90]\ttrain-logloss:0.39640\tvalid-logloss:0.39804\n",
      "[100]\ttrain-logloss:0.38955\tvalid-logloss:0.39116\n",
      "[110]\ttrain-logloss:0.38380\tvalid-logloss:0.38578\n",
      "[120]\ttrain-logloss:0.37966\tvalid-logloss:0.38159\n",
      "[130]\ttrain-logloss:0.37654\tvalid-logloss:0.37816\n",
      "[140]\ttrain-logloss:0.37366\tvalid-logloss:0.37548\n",
      "[150]\ttrain-logloss:0.37112\tvalid-logloss:0.37338\n",
      "[160]\ttrain-logloss:0.36947\tvalid-logloss:0.37159\n",
      "[170]\ttrain-logloss:0.36806\tvalid-logloss:0.37020\n",
      "[180]\ttrain-logloss:0.36724\tvalid-logloss:0.36908\n",
      "[190]\ttrain-logloss:0.36623\tvalid-logloss:0.36823\n",
      "[200]\ttrain-logloss:0.36513\tvalid-logloss:0.36752\n",
      "[210]\ttrain-logloss:0.36480\tvalid-logloss:0.36686\n",
      "[220]\ttrain-logloss:0.36433\tvalid-logloss:0.36643\n",
      "[230]\ttrain-logloss:0.36375\tvalid-logloss:0.36603\n",
      "[240]\ttrain-logloss:0.36344\tvalid-logloss:0.36568\n",
      "[250]\ttrain-logloss:0.36323\tvalid-logloss:0.36536\n",
      "[260]\ttrain-logloss:0.36303\tvalid-logloss:0.36507\n",
      "[270]\ttrain-logloss:0.36280\tvalid-logloss:0.36488\n",
      "[280]\ttrain-logloss:0.36259\tvalid-logloss:0.36459\n",
      "[290]\ttrain-logloss:0.36239\tvalid-logloss:0.36442\n",
      "[300]\ttrain-logloss:0.36193\tvalid-logloss:0.36427\n",
      "[310]\ttrain-logloss:0.36182\tvalid-logloss:0.36415\n",
      "[320]\ttrain-logloss:0.36170\tvalid-logloss:0.36394\n",
      "[330]\ttrain-logloss:0.36157\tvalid-logloss:0.36384\n",
      "[340]\ttrain-logloss:0.36146\tvalid-logloss:0.36374\n",
      "[350]\ttrain-logloss:0.36138\tvalid-logloss:0.36365\n",
      "[360]\ttrain-logloss:0.36134\tvalid-logloss:0.36358\n",
      "[370]\ttrain-logloss:0.36113\tvalid-logloss:0.36351\n",
      "[380]\ttrain-logloss:0.36101\tvalid-logloss:0.36340\n",
      "[390]\ttrain-logloss:0.36092\tvalid-logloss:0.36334\n",
      "[399]\ttrain-logloss:0.36083\tvalid-logloss:0.36328\n"
     ]
    }
   ],
   "source": [
    "import xgboost as xgb\n",
    "\n",
    "# Set our parameters for xgboost\n",
    "params = {}\n",
    "params['objective'] = 'binary:logistic'\n",
    "params['eval_metric'] = 'logloss'\n",
    "params['eta'] = 0.02\n",
    "params['max_depth'] = 4\n",
    "\n",
    "d_train = xgb.DMatrix(x_train, label=y_train)\n",
    "d_valid = xgb.DMatrix(x_valid, label=y_valid)\n",
    "\n",
    "watchlist = [(d_train, 'train'), (d_valid, 'valid')]\n",
    "\n",
    "bst = xgb.train(params, d_train, 400, watchlist, early_stopping_rounds=50, verbose_eval=10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "67255896",
   "metadata": {},
   "outputs": [],
   "source": [
    "d_test = xgb.DMatrix(x_test)\n",
    "p_test = bst.predict(d_test)\n",
    "\n",
    "sub = pd.DataFrame()\n",
    "sub['test_id'] = df_test['test_id']\n",
    "sub['is_duplicate'] = p_test\n",
    "sub.to_csv('simple_xgb.csv', index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "bb6bcd06",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAu4AAAEHCAYAAADxvsMdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAEAAElEQVR4nOydd5wcR5n3v9XdkzZrlbNkSQ6SoyzngG1wxGCMzRmbzB1gjpwPOMLxku6IBo5gDBjDgTHYBueIc5IlJ1mykpWzVtq8Ezo87x/dPdMz0zM7u9rVrqz+6dPame7qqqeqe7p/9dQTlIgQIUKECBEiRIgQIUKE0Q1tpAWIECFChAgRIkSIECFC/4iIe4QIESJEiBAhQoQIBwAi4h4hQoQIESJEiBAhwgGAiLhHiBAhQoQIESJEiHAAICLuESJEiBAhQoQIESIcADBGWoDBYNy4cTJr1qyRFiNChAgRIkSIECHCALB06dI2ERk/0nKE4fyz62XPXrumsktfyt4rIhcMs0hlOCCJ+6xZs1iyZMlIixEhQoQIESJEiBBhAFBKbRxpGSphz16bxffOqKmsPnnNuGEWJxQHJHGPECFChAgRIkSIEGEoIYCDM9JiVEVE3CNEiBAhQoQIESIc9BAEU2ozlRkpRMQ9QoQIESJEiBAhQgQijXuECBEiRIgQIUKECKMegmCLjLQYVRER9wgRIkSIECFChIMMH1zynvznaxf9fgQlGV1wGN3EfVjjuCulfquU2qWUernCcaWU+olSaq1S6iWl1MLhlCdChAgRIkSIEOFgR5C0+99L9x2MEMBGatpGCsOdgOl6oFqMywuBed72QeAXwyxPhAgRIkSIECHCQYuIoFeHg9S0jRSGlbiLyKPA3ipFLgFuEBdPAy1KqcnDKVOECBEiRIgQIcJrEbaY9Fk7sSU3qPMPdlIvgClS0zZSGGkb96nA5sD3Ld6+7aUFlVIfxNXKM2NGbcHxI0SIECFChAgRXusQEV5pv55X2q9HsAGNw1qu4sjWD6LUcBtXvHYgI2wGUwtG+mqqkH2hIyYi14rIIhFZNH78qMyUGyFChAgRIkSIsN+xtvNmVrT/Fkv6sCWLLWlWdfwfKzv+MNKiHVgQsGvcRgojTdy3ANMD36cB20ZIlggRIkSIECFChFEDyzHZldlC2uoBYF3XEh7a8Ss29bwEgOlkWd75AI/tuo5u2yZowWFLhlfabxhQewd7dBk3c2pt20hhpE1lbgM+qpS6ETgJ6BSRMjOZCBEiRIgQIUKEgwl/3vBjlrY/jQApLcOYWC9j9G4atBwbOn/HHrsRlI5Co07ro1E59DgJ6rQcunIZvOl04YhNj7mNvdk1NMQm86vjr+dDS99LqYHDtYsGRvJfm1DYocYgowfDStyVUn8GzgLGKaW2AF8DYgAi8kvgLuAiYC3QB7xvOOWJECFChAgRIkQYKWzr7mJzdxdzWlqxtTZu3PRrVnZvxnSEhGbSZGTRlONRR4eWmElMs2nSepkdL8T6aNIzTI51sTE3lkPjO2k1+vJ0My0GG81WBJ2UPo5Htn+FrX1PomEgOORkOnVahmmJdhqNDDnHYGu2hRvW/4J3z/7wCIzK6IEAzug2cR9e4i4iV/ZzXICPDKcMESJEiBAhQoQII4mMZfLx++7kkU0bSBoZLjxsMZl6g067DtfdT9HnxEnnYkyI9xBTNg1GBkGhIUwwugFQJcrgmfE9NOtptMD+FBaHxPawzhwPzi429z6EoLBxI82s62vnqIY9aAiagqRmUa/v5NWuu8k5/0pci++fQRmFECA34lbk1THSpjIRIkSIECFChAivKXSZaf6y4Qnu2Poce3M9dHcp0ISmqTmmNHVi18GRqa3MjLfTZSdZ2jeT7WYLAnRaScbFunFEAwUWBrqSMtLuo88xaNbM/HelII7NBK2TrXYrUmL60WKkUYhL5j3tsoYwI7WX5R3PcFzrGcM0KgcGHDmITWUiRIgQIUKECBFGEpbtcPfDy7njny+jFFx8zpFc8LoFGLrG0uWb+PPdS9nd3sMpx8zm7RcupKWxrmp9m/d08NuHl/DSpu3oSY3uJpOMbrG7s4++jEncUNRN7aCrI4GVM1Cqnngqh5kxcJwGcm1Jrj7lUSbVdWEoYYJ0MTvRxt0dC3hs7zx6zDit8WYOa95Fa6IPAEOFu0NaovHP9sM5f+xK6nSz6Nj97UewvHcK42K9nDb21bxWvslIs72nmdvXHU1bupGkYXLm1NUsmrQJy9yy7wN+AMPNnBoR9wgRIkSIECFChP0OEeE//ufvPL98M5msBcCaDbt4ZPFaTlo4i5/9+VEyOXf/+q17uOPRl/njd95NQ12SJ15Yx7K125kyrokzF87h7mde4ddPLGFvJpN363Q0BzEUdr2DWQ8gZCzI7GwAFCgQgWxfIi9T2o7z8cffyfwx2/jCsXfRGHft2l/fvIrbtx2Njc72dIxdmUaOH7uJafWd9NpxmvVMmda9145z9+4jebJ9Hm+e9CLddoppiXYOT21jr9VIRhLEtM6ic9Z3jOVPq072vil6TJ27NhzNrr5GFhyza8ivwYEE16QoMpWJECFChAgRIkTY73hx5VaeX74lT9oBMlmL517exDMrNpKz7fz+nGnT2Z3h97ctZsmKzWzZ1UFfxiQRM/jv6x+kZwJeEG2PkBuC8v5pPRpGL2TGCxJz8mUKKHzJOTEAlu+dwjefexP/ffLfANBxmJDoZnu2BVDYovPC3ulMretkmzmGZn07Iq4pjOUoHDRu2X48lsTYaxr8bedCEjGHuDJp0I9kr1UPwG6zyTOXcacbd60/qkQm9++SXbNZ1ymcdJDnr49MZSJEiBAhQoQIEQJ4ec02fvyHh1i5bieN9UmuuHAh73rzieja0Go7X1ixhbRpYidBvKo1EzI5CyOu58s5Otgxhakc/vjw84gp6B6nz5oWuXrItYLogCXE+8ButDGnmm4kEksDUeAosECFGqQLQQJvicHazgls621mSn0nunLotRNFZ9ii6DETqDjsMJvQHId2q562bAOLOw5hr6vmR1CkrTiJWIacxNhrGYBCKei1E4go8EJEdubqCM9/Cd9Z0sWVhw98nF8rEBQ50fsvOIKIiHuECBEiRIgQYb/h1c1tfOzbf81rwTu60/z+H8/Q1t7LZ9/3+iFty1GClSzWfjsxQdMVjhf3z9HBjqt8yBYHwAAb0B0wE9AzA9AUCtAzYNXbiK6hb0mCAjvpIBpoOa8hDeyUU8KyysmyoTm0Z+uZkOpmdd9EuqxU0XHL1rnpqZOZ3rqHQ2dsZW+2ji2ZVqwyciloKhjHUAWOKJ5pn8VJresxVKzqeHU5B29EGfATMEWmMhEiRIgQIcJrBh0dffzi2n/y2BOrUUpxzllH8KF/O4uGhuRIizbqsbe9l8995xYyGauIx2ayFrc/vIwPvu00mkLG8es/vIMHHl9Ztr+pMclnP3Qu55x6WNH+6/78OL//29PkYq51i24CAqIEHHDiCsfjvspWKEuQmCuQlnUwMoVyMQdaVyjMOqFvMjgpEKWhLK8DAlpOczXavqbdAb1Xw250XAF8Tl3C3U1HZ0pdO6/2jOcXm88sOiYO5NIxbNtgw+4JbGgbT93YHrJdddimjqY71I3pI9nkhnlMxYqdU0Wgc2sj7ZubWWfO5BF1HG86PolIl6d9D5lIlO05+DCUzqlKqQuAawAduE5Evlty/HPAO7yvBnAEMF5E9lIB0TWKECFChAgRaoRp2vz7x29g1+5ubNuN9HHPfctYvmIr1/3y/Wja6LaPHUlkcxYf/sQN7Mj2gl4+TjFDZ/vuzjLiXom0A3R1Z/j6D+5AU4qzTjkUgD/c8jTX//VpADQHNAuUCMpyybjZqLlk2iPZCpfY2zhothDfG9C5pl0Tm0yromeGjh+aJSi9IF4o9vI+aRmFk5Jg4cLJIrTofXzhsbezo6+Z1Jg0dS3pfBEzE6NnZ4NXWIFAX1tjvgLH0ulpa0Ckh3Hju4npxZFnMp0J9m4Ygzia15zitiU5mFZqf+/Lo7BGefKh4YaIwpah0bgrpXTgf4FzgS3As0qp20RkRaE9+R7wPa/8m4BPVSPtEBH3CBEiRIgQoWY89sRqOjr78qQdwLIcduzsZMnS9Zx4wiEjKN3+geM4LHlpE4Kw6KgZbN3ZiUIxbXJLkW13JmuyZXsH41rraWmq45HHVtHVlUbp4tqblxBd07KZNL6J9s4+9rT3Mn1yC+3dae57fKVLtB0/VZFrSo5ytdKC8M2f3cX/3vIY23Z1YaVtlO4eQ1zTGHKCpoMTA7RyG3SFa/tu9DiubtQu7MeBvkkaVJqUVdytEBuwKGjcdSmUtzXazBbwDve115HuSGLELWxLx7H1kupVvmx+jyjS7XUkJ7fn94m4244V4/OkvQhZBUkpl1vA2BHel4MJztBp3E8E1orIOgCl1I3AJcCKCuWvBP7cX6URcY8QIUKECBFqxKvrdpFOm2X7czmbV9fvfs0T9wcfX8k3fnJX0cQlZuhommJcawPf/NybmTtzPH+4+RluuOVpNE3DsmzOOHEu41Ip0hkTXQcnXmKjLS4d/X8/vpOlL2/G0DV6shZOEqgrECktLTilNutANzbdOzrdeuKKYsWxglj1VPaOBlZKYTUYpHZbYBfHXLHqqpC5CvUK4k4CxCXxANjl9QRPF9EwszGKbdSrN+3YGo6t0A3x6oD1G8Yjth5KQfVOHTtRbKqEA6pbQ7Oq28C/1uHGca9Z4z5OKbUk8P1aEbk28H0qsDnwfQtwUlhFSqk64ALgo/01GhH3CBEiRIgQoUbMmD6WVCpWRt7jcYPpU8eMkFTDi21b23nhhY28/MoWbntyJS4TLbA+03LV01t3dPCxr/6Fj77nLG645ZmiEIyPLV7LYTPGoxRophDvtDEbdDdKiwC2kBObJ5dtRLME07RxUl4bgbYc33ezUhpRf79I+T7HQdmg2YJoCjHcY4JHzD1zFz1XrozWM4IVC29ToRC/vbzZu+f4Gvf2h+VPcj0hUeJFvNG886XElMUGP/+S6F65QB0CZLMGKd0kmzPYsaeZnMSIVWD8WkZD7YohMQsjreHEBFtX6D0aQxzU54CDoDClZmrcJiKLqhyvFFooDG8CnujPTAYi4h4hQoQIESLUjNedcRi/uu5hslkrH5VE1xVNTUlOOXnuCEs3tBARfnLNvdx114tYloMVV1CnVybNgG07/ObGJ8hkiyc2OdPmlfU7UKaD5gCWoGccl7vGFWa9jhgu4fX4rItgW3lyXIMpg1Kuij1gTx7rcdDycwnXXMds1HASBdIOHm8uoVeNmxzaD1dFtvkS5GACdtxBs11bdNHBSRY07uJIQevuldeyqpjQK7BTxSYsKgeaWdxf26/XOwdRbHx1EiQtMLy+aODUO2h9GqokLrmyIN6mAXGCRvdmwjMlOshhD10c9y3A9MD3acC2CmXfTg1mMhAR9wgRIkSIEAFwSeeGTXuoq4szeWJzaJlkMsbPf/IufvCje3juhY0oBScuOoTPfPICdH30qiv3tveyp72H6VNaSSYL7ExE2LKtHdsROjv76OxOc8Shk2jvSHPvfS/xj/uWYdsOSoH4Nt5h2mxvf7ovR6YnF6phFst2tdy+7bkX+hxdUCaIWXyS5giOBmjK1ZIbypVB99TMvhjBYc/bj4PyzkEJRtol7UWUzAE97WAm9SI1qNmgEe8qtnROdAhNr9r0zNI9cusRdM1NxOQYgiTBDjL+Ev4XJPqaqTyb/cBEQAQtq3CSrjG/skCZyiXpDnkCrmfArgsSfHFnGrrfprsCYrfaiB5D79bdsdIhrnSkq2S24CGWhYPcUmaoM6c+C8xTSs0GtuKS86tKCymlmoHXAe+spdKIuEeIECFChIMeTy1+le/88C5ypoVtC7NmjOWb/3kpEyc0lZWdNLGZ7333CizLRik1qgl7OpPjWz+4k2eWrscwdBxHeO9Vp3LlW0/k1Q27+cq3/87uti5yZpgtB6AJpDxi65NJcQl33qJABK3E7D9UZxkYJ0fhkmoAx22miH8rcAyVVyyL7lJc5VA+KbAph3i5Qj0Nu56RMpkUoOfATlLUeKZFQzMFI10g2qJBvBf0TnBaC6YsdspBkoEKi2Tw9wvEisuoPq1YA49H4m0BwyXlIiAtkleKq5xC63MFVY5nNuNHtIkBlgYJCxVwH5CxJtYYE7E1cBTxDW6redOcoKw20BMylgcZnCGKKiMillLqo8C9uNOq34rIcqXU1d7xX3pFLwXuE5HeWuqNiHuECBEiRBhWvLp+Fy8s28yYljpOO2kuicToUutt3LyHr33nH2QDNtlr1+3ik1+8kT9d94EKWTDBMEZ3hkWA/77mHp5Zup6caZMzXYZ7/Z+eYNyYBq659kG6ezLVKyiNvuIrer3IJYjkzU/6NTAI1KXweK1SKE+Dn7dqwSWlyhZEV26Z/uqu0F5N52mquJ+aom+CjmYKDoLSFE5SYSW9RE0ek7aTrpa9eiOS13bXLjcFMu5/BiQuOOKgpYOB4ckTfXRBhVgyiQYKB+mN4djecY1yuXWIhU2CDiIM0Dm1//pE7gLuKtn3y5Lv1wPX11pnRNwjRIgQIcKwwHGEb33/Dh57eg0iYOgaP9Tv50ffvoJ5cyaOtHh5/OPO57GsYsbiOEJ7Ry/LVmzl6AXThqQd23Z4/qm1bFq3mxmHjOe4U+YOWlufy1ksfmQVu3Z0MGP2eNp2drHmlW3UNyQ48vhZHH/qPPrSOZ546BXstIlmaDgp95Vv7u3jf39wF5by2Hclm3HHQcvYKMtB4jpOosAKFa6TqerJkOhwTWPEUJhjU0gy5tbrgJazcJJGaBvKBtGKSbsPfzIgluAk6N+u3RGMPssl+wqsxuLJoXghHoO1CGAnVHndeXMbQcUVuSaVDwWpWYKfXNQpMlepAFHE94DEwWwuLCtITMAsMZVBECNQZ8gSgSQESQsSFzdCjVGoU8Wc0GFyzZxA7/JaCyPthcWPgxqCGkob92FBRNwjRIgQIcKw4P6HV/D402vzmuyct//L37yVv/z2QxU12fsbO3d1YdvlwR4Uir3tNa1e94vuzj4+/e5radvRiWnaxGI64yY284MbPkhTS92A6tq2aQ+fec+vyWRy5DJWUWhGgFtueIIJU1qIJ2Jo27vRfP9DpfL26Zm2tOuEOTaF1MXKyavlkNjRg3IKphpOTCc3sd4lsY6Q3NxVxP+UJSR29mEnFHZTinhbH3ZdrIjw58tSObxGcZ02TtyoSpD1jE1yt7dy4FWa6DDpm5xEYq6q205oGGnHnad4xURBtllzs6bqlNjrQ91uG80GNOiYF8NOKM/OXApJl/qDQHK3QjkK2QZ9UxycJDhJB93SEXGdVv36nLr+qbNT58Wa10tGsNSjtgSxPt/5tsRRNihshcg5BwtEGEhUmRHB6DXMixAhQoQIBzRuv/uFsugiAJ1dadZt2D0CEoXjhONnk0yUv6wty2b+YZOHpI1ffOcOtm/eQ7ovh2XapPtybN+yh198544B1/Xtz/+FjvZe0r25MtIObkKo7Zv3snHtrrxpixLcKCtS4HdKINadDW0j3taHsqXofC1nY7S7BNnY05e34ijd9KwQ393nnpO1CWO4Av0zEBHi7bmKx/y/yd0ZV04pyACQ3B3om6awUgpRrn29HQezUaGbEO8W4t1SFOhdiZtNVXNcu/7GDe59LEpw4oLdIOG29SVQNihLYSUVZgPEujTibRqJnTpOvY2TdNxpgBLsRrs2k5p4hf22KvIbLpLDAs1LxuSaOlUn+QcvFE6N20ghIu4RIkSIEGFYYFnh2kOlKh8bCZz/+gWMHdtIPFZgTclkjIsvOIYJ48udUweDxx9YjlXiAGqZDo8/sHxA9bTv6WHj2p1ItWxC+Nkzi8sESa0PPetAqWOq7aBl7VBrCqPPBPHMUiq0HdyvWQ56r1lEiiX4V1NFAWKK6jEdlEB8b644e1KgX3omnD0rXLOW/HniEm1NU9gpDbtOA10rTDhsiPX5MdeFZFuh/wowMqBlHUQHuy7omFtBeC+mZWqbQuKqYO6jXK29siHeprs+Ao5CsxUqrSovQ9QAMbXS4cnLF9vqmg4ZuobmO6BKyZg6UL/94Cb0Atii1bSNFEb3esAI45mXNvCLGx9n8/Z2pk5s5uorTufU417bWfEiRIgwPOjqyfDLmx7nwadXoZTi/NOO4INvO436VCX12fBjy852/uOHt7FuSxsIzJzSync+9WZmTR07JPWfd84C1m3cXeT0CW5Mb7Mfa1rTsrn+1qf5xz+XkTUtTjvuEP79yjOY0NpYU9vbdnXysz8+wrMvbaQuFeet5x3LgnmT+cqPb6ezu+CQOW/WBNrau2nvTkNC0DRFUyLO+646jcvfdDxbd3bwsz89yrPL3HouP+9Yzj3lcD7/g3+wdpO7aqDrGvGYzsL50/noVWcya+pY1m/ew//+4RFeXLkVTVOQKxBdsyFGZmIKJ66j52zOePcPMUNMdUIhAofWNgY1wyNthRjlOtmWlvwxo8tEFNhNhXs1u6Alb3Ni9JikdqQx62NkJiW9qDOeWY7HjDXLjeAC4BhgxgFDA80t6+iqiPGLAkEj3gSZCTHsmCrUlYPUTgtNalBPC1g6WPWQGacjMWhaL/lVBwH6JkF6gufEmXNjVXbNUxi9Go4Blj/ctrhRWxrcyYIbtUZBn+7GtvTGQzmgp10TGbvVJlsvaNliWRUKLEE1WTgTTMQPVenHfTcVmICm+YPhwnBQcadsFqaUy9DjcQulIJsx3A7ZwG4dLWOg2zCxN057Txqn3SeAkv9foBD95iDGUDqnDgdU6Yz8QMCiRYtkyZIl/RfcBzzx3Dq+fM3tZHOFF04ibvD1j1zEWSfOG9a2I0SI8NqCZdm84wu/Z/uuTkzPtCFm6Mya2sr133qXS+z2Mzq6+njzR6/NZ730oesat/7kA4wf07DPbeRMi898+SZWrNqOZdl57mHVayTqYvzq61dy6KwJoed+5n9uYenyzWRN9xmsaYqWxhR/+cH7aahLVG13b2cfV336d/T0ZnG8d1w8puejqpTCNwH3PwM0Nyf5xVev4Oqv/4WevkI9ibiBaVqEKbyVgrpknO9/7lI+951bSadz+fqSW7oxekzMphjpaQ15Z0c/zCLBv6MN/SU+koIdfC3JkXz7cnSPtOfJYvG5VsJLNhRWpwixLiHRLjRu6Ssz7xbASiq2n+Xdx7bkJybNa518+c7ZkG0hf0z8yYbuOc4GCXLMRtXZoeI0Lk2g9am87bhtOKQPM7HHOBjrE2jZcjIommDNzuIkArMIP4KMb0I/4HtCSCRMdF3I7o0hbSnMsbYbsz4L4xbriKPKVl984v67L5zHkUceOdBGBwSl1NJ+Mo6OGGYc2SSf/1tton3siIdGpB+je1oxgvjp/z1SRNoBsjmLn/3fIyMkUYQIEQ5UPP7cOtrae/KkHVyN8padHSxetnFEZPrjHc+WkXbwMl/+7ckhaSMeM/ifb1yO06Bhx90IHmajhhiKbM7i1397IvS8Vze3sXRFgbSDG+WlL53jzkde7rfdW+5zbeudgGKqEmmHEmdI729vOsf3fvtgWT3ZXDhpB5dsZXMW3//1/WSzZpHVQ3ZiPWIoMpPq8qS9ohD7ChHXPt2WobFlViGRV8qOUxNph4DNPeDowb0FCF589Up1KkWuWdEzXaNrZtxVSqsCARUFbQuThfKBjKdmvVd/HLJjio/5DtPilJB2QKXCSTtA9+FZxCf7QGZuDrvVdSJ1mmwkzHFUuVFigt8D3RvkPaHI5QyUgkSriZXy7nvNzYqaGV8ez95vWgH/+t/3DabR1wwE1zm1lm2kEJnKVMDmHe2h+7fu6nS9wEdJNIQIESKMfqzasJO+TLmTZs60WLtpFycfM2u/y/Tcis0Vj724auuQtbO3sw8V17Gl2DRGgJXrd4Wes3bjbvQQcpvJWby8ZjtXXFi9zWWrtlUl6rXAMh1e3dRGLmRyU/U822Hrzi7sEnYvMY2eQ1qQUlOEQRO0CnAEIyNFttJWivDJgogbUcWoQMwtwcgKdtyVP9iGnhU3GZJyTV+cmG8aUyN5F0HvgZgITgxy9VoRga7NhFhhNULn4Ql6Zsao22ai5wSzXiM9zgCloXK4Yx4QKz1OYaQFs841ayltS+HOAAQpPVAZ9dB9YobYLh0to7DGFaLOOGMttC4dcqCkEEHGmparHl5nkJBAOENJOST2aDSt1Ij1utfKtecp74wawPV77UJR7t0xuhBp3CtgXEt96P7W5rqItEeIEGFAmDaxhVRI0qFEzGDKhJb9LxAwZ/q4isdmTxsaG3eA1uZ6nAoq6qkTm0P3T5nQHKoojsd0ZgVk6+jqY+WaHWVJhGZPG4uxj9lMdV0xcVwjut7P895yIOc5eDoOSsTLh1PeAaVVYOnViJuIa+ZheW3Yjutw6Ti+B2q+nLIcN9tnQFmscMM0VtK8q0rzEnGJucKzTc85eTmMdOGYEtBM0LLeZMEp0fT78ofcA34UGM2ERKdTJKMaoO+yndLonpOg49Ak6fFxlNLyTqdahqIxlpiiawaYyfAJQj7Uo+dgikNN5FoMyE2xyRxiIVrgFB2sQ7LYU0zsJgu71SI3J4s0DL+DttGh0bpUI97thqTUc0FHAu+6HIAm08MF9xbWatpGChFxr4D3X3YKyXjxgkQybvDet5w0QhJFiBDhQMXrTz6MZMIomvRrmqI+leCM4+eMiEzvf+spobb1SsGH/uX0IWsnlYzxprOPJFHyPE3EDf7tslNDzzly3mSmTWopI9+GrnPJ2UdhWTbf+fFdXP6+X/Kpr/yFS9/zc370qwfyE4S3XXhceFbT0OgfElokHjP45LvPIlZST/67Ixi9DkYWDBOMrBDrE4wuh2xHFq3XQZVGa4FyEiiVBHMJt9HnatCNLBg5N7qJkRaMNOgZl3RpOQejT9C96IelV1XzF3tKo4gIaLZHkkPIm24V9hkmeTlK21C49ehpwUgLesaVW0s7BfnTgt7n5Imisgp15CcA2QKJVLhOqJUIs4AXe714Z7DeoJxaBlRw0cvQsBqrL3doOVW0SVqryHGllP+WltPAabGxppmYY2w30VI/GByfFmIxyzXbSms4uobZWNJHB5QpaDlv0pUDLefeD7/+8tsG0+hrCrande9vGylExL0C3nz2UXz4yjNorE9i6BoNdQk+8LZTufz840ZatAgRIhxgSCZiXPtfV3H0oVPQdQ1d11h4xDSu/a8ry4jh/sLk8c1c88XLixw965Ixvv/ZS5k5pXVI2/rEu87msnOPJZkwMHSNcWPq+crVF7BowYzQ8kopfvqlt3HacYdg6Bq6pjFv5nh+/tV/YdyYBn79x8f55xOryJk2vX05cqbNXQ8s48+3LAZg6sQWrvnPy5k9baxrciMuCVa5gJY6v5Enk4Jr/zt9Sgsfv/JMYmh8+YMXMK6lHk1TGIbG2SfN44ITD3U12wS02v6kzLucLvF0NdSaUq4m2nJQdoG8IuKaJ/ga6aBctuOaowTbKNk0B/SMS76C+0uh4ZJufIIugrLdCYDCnQAou3AMxyXf+XjvIVvZNaOQkDMoX9F54sqhcoJmStn5Rtol9P610DOCMgNj4uBmP7VB5bzVAt+o3QYst80w2dyVB7eMePVbcQqadSnsR+GtKBT+IaB1xZCMKpD0gGiUfBcBxyy/3ZycJ03w3ACCZQm7Xcu2QOMIhmERizmYGY1cWx0SU+w9CuzAgp9uUVgx8a+nuBObG+9YGnJ1Dx6IqFGvcY+iyvQDxxF601nqUnF0LZrnRIgQYd+Qzpgo5ZL50YLO7jSOI4xpHlgGz4HCsh0yWZP6VLxmk8NszsKynXzYTBHhgiuuIR3iMzCmpY5/3PCRon1/+cezXPeHx8hlCzYhvvWDRkF7JYBuKGK6hvKe9ZmsWbD4wCXnV1xyPP+4+wUyJSEuC5V7pipSULq2jqljb0dfoYzyogeqgkGNUuHK5f5GSWooU1q+Ur3Vjg0VfHkFiuzuBc9WPuFqte042J5tvlDeTxU4TxRYBvlQhtXkL7SD6zhaYsmuAMcQMCi7R11iD0pZbtQZsXEaff+A4J0UrFC8UI14ZYI98dh5yGnkQ13a3oTLnxZ55+veTYZ3o5lZJAYqnfI8frVAh6BxAzRuyXck3Jbd2//kTZ8JGbmhw2iOKjN1QYt86C9n1lT2a0fdPiL9iJxT+4GmKRrrk/0XjBAhQoQakEqOHsLuo7kxtV/a8VcvB4JE3CB4hu1IaDZWoMzWHaC3J1tE2qGYsPtQgG0JtmWHGn67Wknh5tufwwrJVppHgP361Ki9o6/YokM8zXDJYstACbhoA7cFr9ZGLe3bumdeM7Bma2rDial8GTvgUFtJy+8PtWigamQzCryY9e53LSSaTaWILvlgjxJDLMGpq7T2UFyhH8fF5cql04/AEk2+Q14ZGwSDwigEKrVV8Y2sDFSv5ktYKCluGXtgP7uDFoLCrCU/wAgiUiFHiBAhQoQDBoauMauCY+0R8yaX7TvmyOlDOlmybKcow2oRAvbZ1eCbJhSVHeDid96+u4KmfjiQa1BkxulkWjUcvWCgUQmVjuX5qaftFgV2UoXHtu8Hju5pz2ssLwSU2SHwHVprGtSSaDUlrRRVUtMCk1/GFo+0F2oLLegECjhVGhCI9bjjXeQ0HIZ+MvK+1iGAI6qmbaQQEfcIESJEiHBA4VNXv6HI2VfTFMlEjI9/4JyysguPnsERh04mkSioZDVN7VPSq4b6RDgRGwDnEQXpMYqOmTqdM3X6xmk4Nb6R880olY+KEkby+iPWtbbjm5eYDRpoCiehkZ5g0DdJp2+ihq33T9JDvztukiUrpRB94KQ9aJ9dK/Llq53jhJQJfBcEp97pv3EFSquRtJdJqQLfqmj2fWubCmL4Z3bOgx0nU9yvIIn3/D0++q7azERey7DRatpGCpGpTBVc9b0/snzL7vz3uRPHcPOX3jtyAkUYFNJZkzufXM7SVVuYPqGFt551DJNqTJs+2rF25x7+ungZe3v6OHv+HM49ci4xfXQv8wWxs7OHvz71Eht2tbNw9lQuOWE+9UnXlnn1tt3c8tTLdPZlOOeoOZwx/xAeW7GOfy57lea6JG895UgOnTK+rM50zuS2xcu549lX2N3VSzpnYmgapx4xi89c8jpaAqZvG3e38983P8TaHXuY2NLIlJYGdE0jHjNYunYrtjjMHNeCphQ5y6ExGefUI2bxxhOPIBWvXYvb3tPH9255hKVrtzChpYEzFxzC+l17aUwluPTkIzl8mps9NJOzuGvpSp54ZT19WRND15g7eRxvPvEIlm3cwU2Pv8Qrm3diOYIGjG9uoCEVR1PK/ZyMs6uzB8sW5k0Zx+WnHsWRMycB0Nmb4ft/f5iHXnqVrGkxtqmei44/nKtedxzjmsrD3+7p7uN7tz7M869uZWJLI595y5kcM3sK63fu5eYnl7FhVzuO49CTdfPYz5vstnfE9Ik8v24r37/1ETbuasfQdWzHIWdZoBSWZaOUYnJrEyceOp2evix7e/pYunYLtscjmlNxYoZBzrJJxgymtDaxo6Objt4MybhBdzqLPRkQnRZLwzYUbdhccc2fy/qRt0CYBK5ZQsCGxSMuEixcAzrJQrP3O/OIk3+qsiHe6aBlHDLjdYgV23GL8hSleW2tezzXBLkmlwErcJ0tAc0UEl2uM2emUcOuA4xiQZUpJDrdCDd2DHJNmqvB9hs13XjsjqZw4t75JbY7sS5BN90wj0baNZ+24tA3XkFMKxC+ovPcenqm64gtxLscYhnXdCUzRsOOCcl2IdHt1mcb0DdOITGFslzSjuZFysm4deca3ARJmqUw0q423U5AvKv88ghCtkWw6l3ZlAWxXoVmBcZcCeKZitgJwUnhrVJ4HdIF/AyphgNxr64skNNQtu6WT1mQdPJm6sr/C8XOqbZC6YLS3YPKuwHLnFAd0DxTdBH3eovlsfwYbgKo/KRM8ubsRYPgAJa333fCDqwWiFYwjVdI0RiK5U8PJF+V0mHW1MphYg8GCCOrTa8Fw+6cqpS6ALgG94l5nYh8t+R4M/BHYAbuROL7IvK7anXuD+fUEz9zDVmr3HgwpimW/OiTw9p2hKFDR3ead/2//6O9u49MziJm6Bi6xk8/9VaOnTd1pMXbJ9z5/Eq+esv9mJaNLUJdPMa8SWO5/oNvI26M/jn5sk07+Ldf/A3TtjFth2TMoLkuyY2fuopHlq3jf259mJxl44iQiscwdA3TssmYFppSxA2dL1x2Fm89+ah8nV19Ga78wZ/YurczdCXY0DXu+sr7mdjSyFOrNnL1L24pLxSmIvT9wHBjr49vrudPn7+Kprr+/V82t3VwyTevL0vIA67mN27ofOqSM3jjoiN4xw/+xM6OHjKBjKGaoshBciBIxAz+/aJTeMPRc7n0OzeEJhOqi8f43Sf+JT95ANi8u4NLvl0u8yUnzufe51eTs8KzhyYMndPmz+KfL706QEkHgIANeVAlvC+v2rAq8zug4MxX6tTnE6VgUZ9k5Zl8sWQOXhKcsqQ/YYIF2s0XHAZSMZDEO8G+eZ8LtuZeMqdgfVUcIUW5dtoCZUmSHAR0hXhjFeuEWG/hdyhKcAzomyxISXQYowOMtMKqE6wWr0J/GH3SHhQpJlBXiCOpvDL+vEppgUsQuFkq+XeCn6TRH6xiu6jgJQ0OEwJOTkNEuY7LpUMXrC54s2YBS6Flda8Zf/XCm5jq7rfxi6EBg2yfVbg9A9UI8OBfPlkWCnuoMZqdUyctaJV3/uncmsr+4NibRqQfw6rrV0rpwP8CFwLzgSuVUvNLin0EWCEixwBnAT9QSsWHU65aEEbaAcyD3P7rQMN1tz/N7o4eMjmXCJmWTTpr8tXr7uZAjKjkI2NafO3WB8iYFrbXj76cyertbfx96YoRlq42fPnP99CXMzE9R7+MabGnp48f3/E4/33rw2RMK59qPp0z6U5n84TWESFjWnz35ofpyWTzdf7mgWfZ3t5V0XzTsh3+44a7APjC7+8sLxB2Xokdcda02Nnew2/uW1xTP7/wuztDSTu4UasypsUP/v4ov7rnaba3dxeRdsgHKRmUyUPWtPjfO5/ky3+8t2IG0L6cydf/fH/Rvs9df0eozP9YvMK7LhXas+zhJ+1BK4LSv/uAYFVl1SlV/DcoT0l5lWd0FZgdFL15Q9sLa1dVqW9fMZB6Vflnvw/K8X4owfoq1Z1nrITanCtNuWTeGyuzGbKtYCXdlYBckyIzXqFsVUSm0cAaA9kGj7SH3C9KBQM9KjAV2KpoiFWwcwSGv59L65YLuTFLLmHp5czXrRcys5e1EXbfKyAGWlYv9Cd/2PtsQ3IHOHWKua+bWrEaBZx7xY/DO3aQwI3OqmraRgrDbaRzIrBWRNaJSA64EbikpIwAjcq9UxuAvbiLP6MWbW1tIy1ChBrx0HNrQiNAtHX2squ9ZwQkGhq8uGk7esibI21a3P3iqhGQaGDY29PHlj2dZfst2+HBl9fWnPXS0DWee3Vr/vsDL66pSJJ9LNu4A4DOvmz5wWrP4sAx07Z54Pk1Ncm4cuvufsvEDJ17nltVkVzvCwxd48UN26uWWb1tN32BSC2rth5Az7gC/9vXKsrRT6V+5s8IBQwkyo0Cz8yDsoEMs/e3k5AdC9nxYDUUzilrU4E0l9dZFVZYYVVwAN0PUAqUNog7uYqMCoWGIjdeo/0IxfN2W8XJYnQvu6YylqPXtNUCpdQFSqlVSqm1Sqn/qFDmLKXUC0qp5UqpR/qrc7jX06cCmwPftwClqUd/BtwGbAMagStEpOw2VEp9EPggwIwZ4Uk7IkQoRaVY2SJSlsnxQEIqHstro0tRnxjxBat+Ea+SdChhGK49dC0QimzNa1niHap8DMkabdw1TfU7mQDXrGU4oFDomsKyK8uglBu/3IeuKZwq5Q9YDMQkpOQ85bgm3S7rKdRRanZcbW//xwYJf0km7Nb2bPCBUIIcLFfcx6EVsWp7IQiacNRQ1TChcs15u/ZhXAipGQNoP3kAmFGONIYqK2rA6uRcXP77rFLqNhFZESjTAvwcuEBENimlJoRWFsBwa9zDel/6SzgfeAGYAhwL/Ewp1VR2ksi1IrJIRBaNH1/ukLY/MW7cwe28cSDh8rOOKSNzuqY4as4UWhr2T+zq4cCRUyfSlCoPzJuKGVxx8jEjINHA0JBMcMLc6RglJDoZM7jqjGOrEvsg4jGd4w4p+Cq8/fRj+j33woWHATB7Qkh20GoMIHAsGTe44szaxvmco+ZWPug9IQ1N472vP57UcEwmFVy86IjKhxWcdeQhRRlczzpyTqWqho7PhU08+zNfC2Nz4p63L3KFVel/0jNCrAeMPjB6S8pVeoNKWK2EGEoPAQSwXIdSPVNctZsdteD8afQRFqIeZbrH9IxXPs2gNc21JJTUcp68WYhlINZF3hk3L9NA1t2Hwh8/XqHDIf0RSyE9BpIe2kAAbrbUgUxZKDIfk37OSxoGVx59dNUyj9362drbfg1CGNJwkLVYnVwF3CIimwBEZFd/lQ43cd8CTA98n4arWQ/ifbhCi4isBdYDhw+zXP3iLSeGi3DO0bP3syQR9gVvO+dYzjjmEBIxg7pEjLpEjKnjW/jWBy4aadH2CZqm+MX7LqW1PkV9Ik59PEbc0HnnacdxxmGzRlq8mvDtKy9g5vgW97rEYyRiBqcdPov3nb2In199Kc11SeoTceoSbt9OmjeDuKFTl4hRn4zTXJfk5x+6tMis5rJTjua8Yw9109yHYOb4Fv7zbW8A4LqPXkZ96YqMKkrm6ELcCBCOAU4M9JjG2UfP4bLTjqIWfOtdFzCltUwXQSKuU5+M05hK8LMPvSUve1zX8vIr3MlMfSKW3yeaGznENiprK8FdWahPxvnZBy/hPy4/m0Mmlk9UlHKjwXz1imJnrG+/+wKmjHEjL4ly25MYfPqtr6O1sS40oo6haTQk43z20jMRw+Ufpbb5/ncHQeUgmLtdRFz7Ul1wtPAId/n07kV54QVMsEWwdfKhCd3NixTuldUCbRb+kS/pINiGYMfcv5igmYUJi4ZHagNtiwrU5e3X0x7xFPGcFPzyLmnFAkt32yn+R8XNUYExKT2ogdng2n47CqyYl2MoUzDnyZtQZ/Aj/3lEEfRccRnEi/LiBIYbClrmkE3wEnZSvj+4YYFmFben2a7jaaG8oERQ2dIKSq+d4MQl36ZI8VXNyyAl92FJHaTcjFJuOU+CokmWf38KYgMZLzqRoyFZreh2LERWLOp12W0butng2IEfTtUbAlSXQuvSoU/hJO3Anez1ywHVB3ovxGzF6TNn8oFFi/xBKN8iAApHtJq2GhBmdVIaFeNQYIxS6mGl1FKl1Lv7lXA4HfSUUgawGng9sBV4FrhKRJYHyvwC2CkiX1dKTQSeA44RkYpGlvsjqoyPYz7xo/znF6/51H5pM8LQY8OOvbyyYScTxzRy3KFTa063Ptph2jZPr91MZzrDCbOnMbG5YaRFGhBEhOfXb2Nbexfzp03gkIlj88dMy+bp1ZvoSWc5Yd50xjXV09bVy7NrNtOQSnDyoTOKtMRBbNzdzhOvbKCts4e9PWl0TeOChYdxwrzpZWXvWPIKL6zbxpEzJtJSnyJjWsydNJbbFq/AEYdUKs51Dz+LI2A7bvSbk+ZO5yfvffOAzG6eWrmRB19cy6wJYzj32Lk8t24bdYk4pxw+oygK0Oa2Dl7asD3/Hp3Q0sCiOdPY3t7F126+n2c2bMmbSema4qx5s1kwaSLTx7fQkIizo6ObrGkxfVwLpxw+s8gE5/l1W/nzoy/Q1ZfhqJmTOGPBIRw1c1LF38On/ng7D654FVsETYGh6XzivNM4dMI49nT1ojRFXyaH7QhTWptIJHU++ofbcRyHrGVjoBibquO0uTN5aeM2NuztwNJAz7qh6VAu0Xbins0yuDuVp1w3Ia4pDF2haTqZrhx6GtBckqjEJdYIZMbiGQnjEhYHMAVNwMi6hFlzD2HWeUl7BBxduRpbkcKsTXnfHUju9bKcBuCTVNEAG6wmt71YT4EEg3vc8cIG2kZBU9Y3Ee+LyxaVqVyzER3wSa3jUT5FIWqKcttTpteOCeYYTw6vHV9+vRfiPeUrJOL13zY8jXwOdDO8nB0n7zhqe1laleUNs8/1guY3/mfHk1sDM1Ws5Y9lysfTby/dUuiH5ggabrBCXwZlgyjB9KL5igjo4BhSkkXUG6O0csc/hjvJtQtlJObNSupsiOO2FBwEDZQfwsZXgitw0hqYfvYrvz0B3YsJaiq3jZjtOZrihl6Mk/8stgY5B5K4YSVtENO7WRxv/CzlhgyNeXJZXt06KFOh9xY/+8QQnDiIIyhRxHpVIOKRK+u5h8/hp1e8me9+7x/c+8BKLAM3NKgjkHMjl/7zni+UX5whxmiOKjN+/ji55IaLayr7mxN+vxEIctVrReRa/4tS6m3A+SLyb973dwEnisjHAmV+BizC5ckp4CngjSKyulK7w2rsJCKWUuqjwL24j8bfishypdTV3vFfAv8PuF4ptQz39vxCNdK+vxGR9dcGZk1qZdakENOIAxwxXT9gNOxhUEqx8JCpLCxTQrgOm2fML17hGtdUz4XH978gN3P8GGaOH1OTDBcvOiLUlOTTbzmTnGVxxtd/lY98A270m8WvbubeF1dz0XG1Lw6ecvhMTjl8Zv77hceXa+EBpo9rYfq4lrL9u3t6eWHL9iLfBtsRHnt1I1+57A2MbyyPxV6K4w6ZWmRaVA0rtu7k0dUb8lGLHIGcbfODex7l9k+/l1MDfQE3Qs7Z372WdK7g5GohdFpZJoxvZPMr3S5RoGDbbDYFUrGXTB4EIAY5hBwCjoOhuaRPOaAHTCmyvqNigECKBhgKxxR0j8Baccg24RHMEqpaCCdS+K4JuUZIdhbLZaVcDXee0IlLvDWr2GRHOS6fE08mNMg0lLSvFJIIaNID4eGLGvUr9iYMljfxkBLCmm+7mk5OgaQ84h1C2v2qDDdEP7k6cBoKQmlZiHux2cWmEMoxSMgFxPHaCfYjU0Usw6vLAZUpyFFk3hMYI4VytfOaN7kJtq2BchSGo8rCXTi6YNV7k7y4fylUUQVFUV/8e0uCX4LFFVgBIu0AWbec+PUlTLAVkjYK52cC190/zwxEhjG9LQjLnZCUJWWyAENQukKZgrLLy9y/8lXW7trDvQ+sBMCwAKtwo4jAnj17GDt2LAcrRMCs0fEUaOtnAlKL1ckWr55eoFcp9ShwDK7SOxTDnvpJRO4SkUNFZI6IfMvb90uPtCMi20TkPBE5SkSOFJE/DrdMESJEiFALXqgQjSWds7ht6Sv7VZb7Xl5DJsRpV1eKx1atH572zPL2HIFP/+mOsv1rd+0pikzjI2Na3LpkedE+Jwa5Fo+0DyDMoV3BHzhfTwjEmyzYBmRbAL1Ke6W7lcJJFJNoK4mr8dW8ejSVnyjY8RLCXSSIu9l1YQ31gzK5yGu083WXwPG19CF1OQGSayeqyIy7IpJfDfHadRKQaw6IFlKB4F7nsLZD21MFzXolJ1rBjd1efJpClUaEUVRUSwqC+OY1RpUoTmFCKtB8Tf1A4JnhOLkKHQvaYiUCpj5hVVUR2U88peUqU7vfP/1cVVHff/Ufqh5/rcNPwDRENu7PAvOUUrO9MOdvxw3GEsQ/gDOUUoZSqg43gEvVl0vkXlwF37/rUa5/dGle2fGuU4/lC28+e6TFihDhNYNHV6/n2seeZe3ONrK2TdIwOPPQWXz89acxtSVcIz2cMG2bW5cs5/rHlrK3t4+GeBzTDveSCwtZaTsOdz6/klsWL0dEeMsJC3jTwiMwbZu/LV7GXS+uYnd3L7u7e7Edh5a6JNNaW9jW0UVfNoeuaRw+ZTyfPP90jps5JV/v7u5elm7YGmqGmjYtvnLz/Xzl5uJY7HFD5/BJY+nNWqzbvbdmqlGa7ycMq7a3seCLP6peKICdXcWhV/OEboAmaxJTpCcE7JfzB6qcpBR942vsfbBYQLRMk6fRzWu2Q4ii5mr+NQtwXLJrB7XAXqIh3dNi57Na+n8HYbWaVwKHwIm5E52g6Y6j3ElHYfzBToFluqsIPnHW055Ziu6GYAxr2IlDptU1VdL7CCRGcvtt1RUmTUGY9a5Tqkix/Dk/mbVnZmPH3KyxdtLTwtuufb478QlBcFXCk9FscpcAlGcTLoa3ShBzvGyptQx6SRlD3GUfJ0DCDRstYeevcT48pQ1a3EHpFPw3LJ+hF/qrbJXvt5vJlUE5B+cJf5WfVX+hdl8jVqT7BGeIXPBrsToRkVeUUvcAL+Fe9etE5OVq9Q575tThwP6wcf/UH2/nvpfXlu1/3eGz+fl73zKsbUeIcDDg5w8/zbWPLCZrl6uQUjGDv159FXPG778lW8cRPvDbm1m8rmBD7mtJS+NEp+Ix/vvKCzknEH1FRPj0H+7g8VUb8+YiqZjBwtlTaevrY0Nbe0GD3c97wdAU37jsPC5ZOJ9tHV287af/R0dfFRuDgw2+g95wI2+sLv0zGv9esSRgYqHyx3wFnQoUBy+LakDbXBOXLGkWqBgK0o8UI8rTkodYepSR3lIZKnU9byoEercrg50EJ1XlHADbi2JjenbwdYEVAuXZrmueH0KwndAuChITl9xXkzUvsxT+KiBph1xaQel4Nu6uKQ4UJrQiuE6ppo6K26i4hFheOWV5u8SBXHe8sFTi9ykLmmgF4u2Z+VToMHpfuRmMINgp8WzgIdYVYk4DPPiJ9/POK35ZYXDg+9+5guMXzqp4fCgwmm3cW48YL+f/7tKayt54yq9fe5lTD2SEkXaAR1YO/ZJ0hAgHG9p701z7aDhpB1eL/D/3PLpfZXpq7Sae31hsQ54nErjRXeKGTjJm8MbjDufsBYcUnf/y5p08vmpDkY132rRYvG4L63fvrZm0A1iO8K3b/knOsvn5A0/RGZH2YuxP0g4DU0OGZU0tIe3Bz/6k0P87qK5VIdZ2ys04mhtD5TjuFUxxQkk+Jfs9BbLd7Gnz+yPtADpYjZ5cLQH7dJ9TK1UwiSm1M88X9UxKtICNfb+XSQKTFOXOZkzlEXIpbKqctLtyFf5qSUFvtNAS5aQ9aCOvSi66HreLvgOuEyqe2Q+qurZdgRMvjUbkRdfx/SNiYKfKTW5imsakpsaQSgv47Bf/UvX4wYAhjCozLIhMZQYB0zSJxWpLvhIhQoRyvLBlO4amkS0N3hzAko1bKx4bDjy1diPZsMRPnr3sGfNnsXDmVE6ZN4O5k8pzOTz76ubQzKc52x4UG3McYd3uvTy5ZtN+4akR9hESsD+uYMYcui+gxT2QL7TAPsVTL1OqV0sW5cGJiUt698WywdLBFkR3UF4s9zxZD7uONZiSVYLybOTtYNLmEsuZWiAxsA3xQo56JkklY2/XgR0TEl2FThi6zpaOrsEJf7Cgdvv1EUNE3AeBiLRHiLBvGFOXqpj51UdjspBgKm2aLN+xi7aeXiY3N7Fg0oSy5E37irENdegVspzGdI2T583gipOOCT23J5ujPZdBj2nY2WLyrmsKp6q7WTgszwa+uS7JDs9GvL/XSanFQ63wOaPylJB+RcoZZH1ePcHz/YAc4hMfL7xgWIZ3wbUmUODaAPvnB2yIK8nln+tHOXEAdC8KjSrsD9ZJiblz2DiGyYS3T3BJ+0DvyGDXHc2zwbYHbi5TazsDvZYChUyqgT6H1+OZngzUbwHBjQ4zCBiUDFbgbstf4FIbFv9iq+Kb0vE7Wl2SfbUuHjLrZFWw/S+78cQNTerG4S+YedmOQ1OyPHFfhAIEsEZQm14LIuJeATFNw3TK16v0yHMjQoR9xjHTJjGuoZ7N7Z2hx3VN8e6TjwPgxudf4lv3P0zOsvOEqjGR4KeXXcwps2YMmUwXH3cEP3vgKWynXOtuaBoXHH1Y6Hm/e2opP37oSXRNozdmo3TPuc97Qcc0HdEoaPOrsGvBS2IjsGDyeHK2zdq+dqx6t06fPDl+TO2Sc/upvmKboio7/WlenO9a67KTBXttcO1tNdNzcgx5HzqW66yY/24EbJvBTRCU9SLHeOdrXlz20v7bBlCBl9ilWkmnWB5lgxawSAqOo+M7aQZ4oZ4plglA+tyY8aUXoYLPqyuXH7UlUI/tZTwt7Z+EXPcweUvLg+uQqlUI/VhpouIkiq8leAmk7NK2xJss9X/n+US9dJ87UyzsU1bABCYoVBC6FDKemsoNeRST4vvMBixvhxJIBn8puOEQbeU6nbqFcJM8FbTrFbslFO6jojLuBKD0XBGwMyW0SygKVylIwadGKykXcpE0U+EoycsQ64Qxr3jXXdw+90wH1aBz8uzpjKlLgeOU2/F4M4qH7vuPCp09OCAw6jXuo3taMYK47wvvC91/z+fC90eIEKF2KKX4zXveyuyxLWWTYU3BW487kveeejxLN2/l2/c/QtYj7eA+WLuyWT5009/Z09s3ZDKNb6znZ+9+M/WJQigQBTQlE/zq/W+lOVUeXuOxtRu45uEnyVgWvTmXSYoGUqeoT8QYU5/il/96Kd/+l/PyWVoFCpkoSzYnBk7S3ZZ37eby3/3Z9QPwbJVFc4menXQJbtH5uhuq0Fck1rxpHmkvtWv2Nidemo20RObAZ9sneoHzXXtbCuSmZBPDjUnuRzVxEiVltPLznXh5/x0dl7RX6Ad6eb1Fcuie/IYriz+OjgqRP0QmvMmPb5sdvMaO7jpgll0bzbX1Lhsb7xoHy9qJwqSoqA7lXZ/S/d4EyM/4K3Hvb8g1JGSfE3PrCLsf/FUGdxO3bAU2UZqfNrhPEJyEd297yx758jYuofUaKs126ijHJe2+bLEAaS+97rpTTNqDxw28SDGBHjluIfEcREOTiwpobQaxNYkiOf0tnwHV8frhgNoRc7OuBn803nG/X0qgbr0i1uEds71z0yEXyQxMOB1QOWh92Z1oa7Yb/EazoXGTcEjzGL731gtd2bf1FHfK71hXd/hFPMgwhOEghwWRxr0CJjQ3sfy7n+IvT7/AnS+s5oKj53LVqQtHWqwIEV4zmN7awp0ffy9rdu1h854O+kyTZMxg4YypjG1w1b+/f/b50Njl4CYfun35St574tD9Lk+ZO5Mnv/Jhlm3Zwaa2DmaOH8NR0yZWzJD6i8eeIV0a61yBbmh8620XcPYRh+TPtTXh07fc7ZIC8XRyfkIioWDe4dVhOg4dmUzRPruOvObNSXqKM3HJm6+GsXQKpiD+uXbgu1dW2RQn76kEry1xyIct9BMoKQr7cCiQ45Lzi/6G1I9HECuFHgzTNvoy5Y/V0I9+v3skV+GR92pyVzhmJd2MpRAIsehprU0DNyyhN2EJ19ZSmNDEvXMdCmOUcr/n7xnImxARMh4SiOcucS8Wvo2b2Ce4CuFn7Axcj0p9dpKFthzdLa+ny4v6lN2vyvETLPkE2O+7eHL5cufj00vBdKsUiZKdPkkPkReDgk1WWL88bbs4CpTnkCpuYclbvok77p0K3zXH2GWgHI34ihROykHqHOhVbiZiBSqjUAmv/rSGchQ6riNppskh1Qaxbg2r3r339TRuxlNLkdgGzi7BjrshPTVL4WgOZr1LxhMdoBxFrgHEUMS6vD6GjZUDrdtUXvmQANjWQ7YRqK8D2yax2132+tQ7fsGP/u/DIZUcHPDjuI9mRMS9H1xx8rFccfKxIy1GhAivSSilOHTiOA6dWO7sCbC7t7fiuabj0DaEGncfhq5x3MwpRXHUw/DUuk08t7k0CZ6LuKEzoaWhiPC3ZzJFJK5Eeef9dT+FhXHLI3hIC3lPewSmaL8GDsUmCmExtqu1mTeZUJRFs6uJOAdQZi5RC7kP2zXUa8aq5HO+n+XmHaVfxZ+NGcrltAmPNAcuhCh3f2n9FWXxywZU434kFV+AojlNWH0VJihlb/+BjmVg0uBr4rVcYZz8e9lJusRTHHHv/ZB2xO9r6eQM9xwVCKuZ78NAnFJV0SiVHCv5IrhkXfejxRRuTq1LI741ke+f31eFQk/rkC6ZOSgg6235XQo9p6jfrmF48/J4L9AbOMfrp2YpNy+AB83RSHRKPqMtQCKQIkFlw31GFNDRXT6zSnQD3cXP0I1rd5VXcJBhqOK4Dxci4h4hQoRRi7PnHsKybTvdyCwlSBkGp8yaHnLW8ENE+OJt94Uqt8CNCHPohOLJyOmHzKxcH+KaIPh+746gZ6kcy3kgsnoEo4i0hxHR4UJgkGxDChpgEVTOTVg0YFkU+QQ+xU0NTb9KJ1LVy4o7qcnH+hbMpgDZDIgTnPyUHqulnaB2XkQ8z1uV10qPCN3wVlok5poVKVPyqwGOl7TKToIycTXVYasyJRAliCHFfZWS+8SucBOU1xb4G1I4vzt4UaSsuAhoPQViXvN9VmnOUCkCj1DdObnSMal+t55y3OwqRwv4+k/+paZyr1lIZOMeIUKECIPGVQuPZmJjA1qJHbyhKY6bPmVInVMHgl09veztq6zt/4/zziQZK9aLzGodw9nzDgktn88O6Zuy6AW7X/E03P1TyHJUepW7UTzKj4XZIlerp2Bn7ToniiqmSeJp6kUHxxBX2+yTT83VPjs1BukqXqEQSqWqJKvkS9c2hnn5lRRMmSqQNMErU2JX7aTc88vq9csMEIIUzFeCm064irXWOgewP7ysNzae2YwYbt/tOs+cJhBWUeLeakPZSkWhDHjjHmarHhw7wSXuNkUXtTykZmlfpPRGCinjCiOBSbNvAq71DDRuY2UxivoS3N8PcY8ndMY0pkKPaRUizybiBh++8oxaJKZtd7b/Qq9hCGA5Wk3bSCHSuFfB7ctX8sOHn2BbZxeTmhr51OtO5S1HzR9psSJEOGjQkEjw9/e/gxuWPM8tL62gK5NlQkM97znxOC49an4Zod9fqIvFKoaznNTUwBXHHx167JdvezM/fPhxfvVkIfOzKAnXQgajngQsBWrpcdzQyFpOUVSRUrgkWwqp6sHVnDqCwjNTIEDkRPLlCjKoYtthBTjihXss1jg7ccqF9wmdWV1T7pPe/JBrCkcEFQjd6TtTKhM0K3BtVEDqAG8LtlZMVgNy+1sFIiWlhJJCedEpxHWvXk143ZT2IbydUAJYS50h3/vbX/Ea+QTaI9u+/0N1WTyU8B/RK9h64Gre8zIIkNGQuBNIYORXIsVjVjT4QpHhfJGggtKCmv7AIWeQK2ClP1qPnOt9XjQlzfMTwL1flO3+dHRNQ9cUmtJQCuqTMU44fAb/etFJTBrTyM9ueoy7n1hB1rRIxmMsPHwax8+byi33vMD2ti7EAcPQOPW4Q/jCh86lsT7MgaQcE6e0DLyPryFENu4HMO5cvpIv33l/3jFue1c3X73nQUTg0qMj8h4hwv5CYzLBR04/mY+cfvJIi5JHYzLBKbNn8OS6TViBsLGpmMGHTj+x4nlKKT5z9hk8vm4TK3fuxhapGI1DM6EoXJtG9YyKHgTIieM6oObtjcuJqngRVLQMKI/IOEkqMy4hn/DF8RwMtYwUTELyciqPYAlh2UMHhRAHToVCDNd5L8jBJOGFacS1+XXDJ5aYrQhlVha+E2Ce0vnkTQPsEv+AUNJXJJx3XmGXQMGBNwShk7K8CUcFVl5yqNrELmhGlJe/dFx959TSSjyyWUScA8V8rbs4rslXzajgmFvtHiwUc2cIKqdBDiRuFzvVqpILHJzg5C9w8eTIJ+1lURIFtF69iLjX7I8S0r8HPvt+Jrc0cdl//Z5NOztQZkGOZMLgex96E6ctmFW5XuBz7zqHz73rnLL9b79oUdXzAJpaUnR1hHgTA4ceOa3f81/rkFFO3CNTmQr4wSNPlEWzyJgWP3rkiRGSKEKECKMJ//OWCzhi0nhSMYOGRJy4rnPxkYfz9gra9iB+8bY3M6t1DHWxGPVGBaZTytU8ElDJ5CO/XwvwEs8kpXDcC6Xnh/qr1X7EF8HxNIJZvMg1FV5wCsqCX1dqRwpiFG+B0IAVVd41yNuPJj9fu+GHmPT2BGNpa6XyBI5Vqbiofo/Mh/VPQvYUSHsV1KhlL7X9Dx2T/urKr8xU+RejyPm639ur6o1cA4LdyHk/jppO9m1SSvap8tsWXEKv43gmYe5WE0KKvf/045kyphmlFD/96KVMGddEXSJGfTJOPKbzvvNP7Je07yuMWPjsMZbQ2b29c1jbPhDgoGraRgqRxr0CtneGxzPd0d3jah2iREwRIhzUGFOX4m//dhUrd+xmW2cX8ydPYFJTY03nTmpq5K4PvZtl23eyp7ePP654kae2bC5SFiilyl/8+TB10JJKcs8H3s2X7rqfB9es904iXIMZIO9OSdKgQjEFpoRH6/DJlEeERcRbEajcx1KyqJkh5jKCG4s6uNMjyY4GSnfJbmmypRDh80RZhezvF3qhj37x4EpIfpLja6ShOPRiBZMV3wSiSLNcVR6vsoLNB0U9qmQaE5QjtNYKo1d6XrX+aIXvvgmJAPgrHnrJuf3IFNanvMNtSCZQd1iqreAosAOpeCWknFTYX0XLr/xj4y3sVgvVo7sEfneCWEclD9NCnYaCaWPHMH/yeP7rkjdQH8hcOnVcM//4xvtYtn4Hnb1pjpw9mTEN4fbrQ4nJ08eyd3dP+QFRNLfWD3v7oxkio985NSLuFTCluYnNHeUzz0mNDRFpjxAhQh6HTxrP4ZPGD/g8pRRHT5kEwGmHzOTHTz/Jn5e9RJ9pctK0aZw0aTq/fGJxeRx75XKCE2dMo7W+njccNo+nNm2hz6yS3rTUHMKLC65rimljm9je3oPtOGi2p2gudRi1/aybyquumhbbdahVUkLevQQxUrLAoAmIHmLjHkjqIzqh5ioSmMgU9hc+OAZoJfbzeXMPVajH0XFt4x3lOdRKedZKKN4XIPtlBFUo2PiXQgUqDCXzYWxXkbftKW2n0JGAMMWoGm3Hry84KSmTKbDb00r7WUHFpsAkgqQ40LdSqfJDVjJ2yuuP2FI+2QnvWr5/AMTdv4ZnH551Qrw1q62SVDigfEcQHaTJplnVMaFrLJuNTiY0NXD+kfN4cu1GXt21l4ZkHF3T6OhNM6m5kY+/4VTedOwRlSp3nwOHTK54fDhw5QfP4v998k9kM4VnRjxhcMb5R1HfWJst/GsXCnsEHU9rgZIKDlajGYsWLZIlS5b0X3AfcOeKVXzxjvuKXprJmME3Lnj9QeeguqO7m3Xt7cxsbqYzm6Urk+WoSROpjw/EmHFw2NPTx5qdbUxubmLmuJZhb2+wWNe2l2XbdlIfj7Fw+hT6ciZbOjqZM34s4xvKNRjLtu9k8abNTG1p4oXt26mPxTlpxjQEmNvayvPbt/Pyjp3kLJvGZILTZ83iqEkT6TNNXtq1g+5slrpYjMPHjWdsyk1WtGZPGze89Dy7+9KMTaV449xDQSlaEknWdbaTNk1OmTaDl3ZsY/G2bXRl0rSl0zTF4xw+bhytdfU8t20rT23ZzNhUHefMms0dq1ezq68XRJjS2MSnTjmVjZ2d7OzpIW4YnDZjOqdNn1k2mV2zZw9tvb3MHz+ede3tvLh9B0eMG8fuvj7uXrWatGUyNlWHg+Ag6JpGazJFzrZprUtx6/IVdGdzpDMZsjaAQgN0XUMTN4Y7wAnTpnD50UfRmenjp489TbdpMq2pkTHJFCt378bxQqRpQDxmkIzFaIzH2duXpjNXCIZcr+s0JpN09PaRLX0mlkSuGMi0vaimUuVcNP/fNwTt/T0SWZF8DdCyIa9wK0mKNWIokb9UKT6ColCIK48rUBUldC31BWPn91enW8YGL5urqlUVWRq2JX+NHZRWYi6jHJTurQT0atCtoXbHiVdyTglBUoeMv2pgg9ZXGLLW+iQTmxvZ29ZDdyZLS2OKt595DIl4nMWrNqFrGvXJOPc8uwrTsmmpS2Fj0Zs2iWk6U5rqwYH6hgRduRzjW+p5z+uPJxWPU59KcOjsCaHKxntuXsKPv3pr/vu5bzmOj331EuKJGsM87QOUUktFpH9j/BFAw6GT5cifvremss9c8N0R6UdE3Cvg0G//qOKx1V/61LC2PVpg2jZfuOde7lm9BkPT6DVNdKVIxWLYjsOXzz6LK4/p3553MBARvnvHw9y0eBlxQ8e0HI6dMZmfvOtNNASWGkca7X1pPvB/t7Ji+66iKCO6UqTiMXKWzSXHHMHX3/h6dE2jL5fjouv+wNauLqDwcvKzZmqqsv9hSypBrzKxHAdb3MgfMU3nyiOP4onNm1jbvrc2oUuUfZWOF6MyRWiIxbjjHe9mRnMzbb29vP+WW1m3dy+aUvSaZu32qsFmgucUReYYYqpS0bQg5LhvKkH/hKlilys540WoHRV+IIOKfR1STCpdo5G6TlVkH2niLkrC1+1rFCxfV8n4FvkRBEl7aRlNIOkULTr0vyBe4QHo30BKQAmaJmgxKa9PQHoM2BbH6FVotXS2pIhKg+45eucP+RFl+hU/MDbi5UEI/CZE85zHLWixdMa21POD/3grM6a05stcsODLFau/Z/m3+u/PPmI0E/f6QyfLgp+8r6ayz174nRHpx+heD4gwovjZU09z75q1ZG3bJWCALUJPLkfasvjWQw/z/LbwzJH7ir8uXsbfnn2ZnGXTk8mRtSye27iNr9x8/7C0N1h86m93snzbzrLQgLYIPdkcOdvm9mUr+d1TSwH415v+niftEDA98B68TpWXdHs6Q9a0sQNh+XKOzR9femHoSLt/cABEpcc0eetf/gTA1f+4jVW7d5O2rPw9UxNK2/O/5+VVQ0/a/XaqiFE0Fir0lKrVlg3lgacnGbUoujT9jWvIdSyFgBuJRw34JzC8qCD7SMlWEEPCY8sPQDBV9sH/WvJ7r1RvyimK9z4gK9Yymb0P4rbtk/ayTQPVYMF4c9APA0mRv9fy+ytklS2vLyhMSFccl8wTg24stu3q5BPf/BtOtZdLhAI8H45atpFCRNwjVMQfX3ix3L42gIxl8fvnXhiWtm94/DkyZnHbpm3z0Cvr6M3mKpy1f7G7p5fnNm3rl4tlTIs/Ln4BgKVbtpYdL4pL3A9UeQJRQnZVr2NQhasLtzed5rGNG1ixexfWAbiKB0NLhMLMGJR/IMI+Y1hI66hg6f2glon3/sJQsYf+6qn0mzGG68ekEKfAjUNLeOS93wljocoy2KUWKYpCZt1aoVTBATrQlP+esJMKEejuzfDSqvJ3TxiqaeMPFoz2qDIRcR8EFlYxo3ktoTdXnSAL0NbbOyxtd6Yzofs1BX2jhLh3Z7LolRzQQspCDbytSnVu3OLaZBsJbOvuxtCiR0qEAxijghFXwWiXb39i0GMxEDV5FezLs7jSCsJg+lTpnMCsQylFZ0943PYIxRBARNW0jRSit+wg8NxBYuO+cOqUqseThsG58+YOS9unzpsZmhWztb6OcY2jI1zVjNYW4kb/3lAKOHHWdAAaE1UcegOmIWHIR9HYRwzufVP9IaUB58+ZN/TmLKOJqAxg4MLEHsVzrgMOwzKWfuSS0YzRJN9QyVKLmVMY7ME+HPprUPq1vRIBsfbhYezZppeJVUOCtVJBwjIju/nUBGy3H6Zlc9ShUwch6MEIhe3UttVUm1IXKKVWKaXWKqX+I+T4WUqpTqXUC9721f7qjIh7hIr42jlnUx+LEQvRoiYNg6lNTbztyCOHpe1PnHcajckEMd1tW1OKZMzga5e+YdSE4zQ0jf964+uJ65XXN2O6RkMizufPOxOA71x4XtHxfOKSfn6JvrOWZhT3XVeKemPgUQBqeucOgMh8aNEJtKSSfO2cs0kaxr7xbSn5u59QtblBhPAIDl++7uiJO2QoGtuBXJt+7qsS3z8Xo+ORk8eo4O+iCrHs96meSrul6nEcwCpZhRyILKFl3Z1KA8cqtmUu+uuAtMepkbuFO7lb5cfLyHwNUFbxb0HwnFOBeI+bifXdbzmJ1ua6murbH86pox1DpXFXSunA/wIXAvOBK5VSYWEJHxORY73tG/3WG0WVqYywyDIHS0QZH1s6O/nNkqUs27GTMakUWdsiY1mcP28ubz/66GENCbm7u5c/PPE8S9ZvYdbYFt5zxvEcNnng8bKHG8u27eAnDz3F8m07iek6J82ahiPC1o4ujp42mfedsrAoMc+STVv4+v3/ZFN7J7Y4mDgoBS11KaY2NdGaSvHiju10ZrI4ImhKMXdsK1943Zm82rmXW1auYG+6j/pYnDccMof3H3M8e9N9XH3XbWzo7Mi30xCLMbG+AU1ptKV7EWBiXT1bu7rKHEf9R1D+aSBhR13ouHb1CphY38CXzjyTiw89PH/8+W3b+O3S59jR0820pmZW7NzF9u5uErpOdy6XD+UYilJBaogo089CRf+oFlkm+EZ0So4NtFpFOXEfZYTwgECFCWW/9sY13CSCp60sNWUYSU/VavfnCKHws5B8ZtkiJ8wB1pM/L+/uI8X7QyL95DPcxhw35r/vqFlT+1Iup/Lqy4eDFJQmaLqgNPITBUnr0BbD6NbQambuFD/b0mDYgWeM4xLwmm+zQAYsZYHmPZtEc3MXxHWNWfXNzJg4hsvOP5aTjplVVkWYLfv+Iu2jOapMau4UmfvDD9RU9uVLvlG1H0qpU4Cvi8j53vcvAojIdwJlzgI+KyIX1ypjRNwjRIiwX/D4ho185Lbb898dEX5w0YWcV8Hcak3bHt7zl5vpzeVQKEzb5uOnn8KHTj4hX8a0bWzHIRkrrDqICJbjENN1crZNTNOKVmn8fS9t38k7b/wrad8J2nsUJmMGr58zmwfXrCOm64gI2ayFrjRiuoblCKfOns5PL7sYlKIvm+Pqm/7B8h27MDQdy3E4/ZCZoMNDq18tcx7WleJ7b7qACw6fx3f++Qh/WPrivg3swQSftJeymxAeVpGoD4TA+9lARxphE5UBnL5gwjg2d3bTnc32231dqXzkqhpFyQvzsVNP4hNnnOqW836HhqZhOg6O43DkT38aen5M01j2sY9haJoXuSzLv93xd1a07UJX7vmvmzmLn55/sZdAC/wsUIauF5lV/vD5x/jlsmfIORXc9ksGLqEbPHfFx6iPlSuhTMdGV1qo2WYtuOx//8jqnW3YgYguqZjBNVe9idPnzRpUna8FjHbifsgPPlhT2RVv+a+NQFtg17Uicq3/RSl1OXCBiPyb9/1dwEki8tFAmbOAm4EtwDZcEr+8WrsDIu6e2n8igcitIrKp5gqGCBFxjxDhwEJHOs3pv/o16ZIoRUnD4MF/fR+TGhuL9jsinPmL69jRXZyWO2UYXPe2S5nQUMd7bryFbd3dADTE43z/4vN5eccurl/yPL25HJpHQFqSST586onMbG7mW/98lC2dnTQk4pw6cwaPrd9IX648bGXRa9pLwFT66vaVcNUgfsGKDmT9VBChGP7rKoS490veB6CjElztZVFiodGCEmX0CDYfKsAh41pYMHki969dS9qy8hOB1lSKvelwB0kBlO46UTri2ZhrxW35E/CcXUzIY5rG2xccxZdPO4uEYfD+B/7GP7e8WrkDJTLXG3H+8cZ3MbdlXH7f8r07+M9n72bZnh0Ymsals4/kK8efS51R+wrzhrZ23vq/fyyLjgZw+ryZXPuet9Zc12sNo524z/5+bcT9lUv/qz+N+9uA80uI+4ki8rFAmSbAEZEepdRFwDUiMq9au7XmGUMp9THga8BOCu8rAYYnA88oQc6y2N3bx7j6OhI1OCJGiFArenM5OjMZJjQ01BSNxRFhe083jfEETYmRSUK1p68PWxwm1DfUVH7D3r08u3UrO0sIuA/Ltrn55eVcumA+uqaxfOdO5ra2sqZtL11eJJ4g0pbFr59ezJObthS9wHtyOa6+5XZinnYPyGsNOzIZvvfQY0VhKruzOR5c82qZZjGU+FUgfDX7kVWzjx+E7fxBjWrjWMu+gbRRbcI1ClAxUutAbMeC/QurJ+RYmVkdAdMWBa+2t/NqR3u+oP8by5P2Cu2IU/D5KcuUKmDaJdnPvHpM2+FPL7/E9u5ufn3xpRw5diJPbNtAtpLGvQSWOEyub8p/39bbxdsf+CO9lhu9LOfY3Lr+ZTb3dHL9WW9nV1cPzXVJ6hNxejJZtuztpCmVZHJLY9HKXmc6U/G53t47OiK82JbNnl3dNDanSNWPnsSGIwlB4ThD5oy0BZge+D4NV6teaE+kK/D5LqXUz5VS40QkqMkvwkCY6CeAw0RkzwDOOWAhIvzv40/z66eX4j8h3nPCQj75ulMHvWwWIQJA1rL4yn0PcMfKVWhKkTAMvnTWmVx2VGVH33vWruY/H36QXjOHI8I5sw7he2+4gIZh9DEIYlNnB5+4+y5e2b0bFMxobubHF1zE/PETQstvaG/noutvIGtXf3laIvzwiSf54ZNPFh8Q3EyCIczp4fUbK9ZXyX4+LLa8JVJGIkJ5tEcifKe0AfujVTLviDA0KL3k+0Dig5dJ2bhxtUfLdau1X34naulzpTJl9t/lZf3AJSjXdKVf06KQtiQobxD+Y6NSeCbfGNyr03aEB9a/yteffIB/P/Zkrn15ceVzAtCV4t2HHVdkJnPD6iVlZjY5x+a5lVs59bFfYDsOjghj6+vY3tmdL9Nan+Kad76JhbPc6C2HTRpfZCLjI27onHX4nJCO7V/ce8tSfv29uzFzFo4jnHXR0Xzsq28mnhh4sIPXGobQgPxZYJ5SajawFXg7cFWwgFJqErBTREQpdSKuyqAqzx7ItGIz0DkgkQ9g/P7Z5/n100tImyZp0yJtWvz+2ee47qlnR1q0CAc4vnTPfdy5ahU52yZjWXRmMnz9gX/y2PoNoeVf2LGdT91/N3vSfWQsi5xt888N6/jo3beHlh9q5GybK/76F5bt2knOscnZNmv37uXtf7uJjky55sgR4cLrf98vaS9C2JNSK3FSGw6okq1UlNLjg/BFG+2a2wMaBUVv9SGu8Rr6zoL5IjZD+hbfJ5TKXk2u/SSzm7zT+1dldapfB9sijb6XNbXa2IeYTAlw/Yrn+PXLixE/2k1QppC6Lp51OF9cdHbRvpUduzBLiLvWpaG26fRmc2RMi5xlF5F2gL29af71NzezvcPdn4wZfOnis0jGClG2EobB+IZ63nXKsRU6tn+w5LHV/Pxbt9PTlSabMTFzFo/c/RI/+fo/RlSuUQEZuqgyImIBHwXuBV4BbhKR5Uqpq5VSV3vFLgdeVkq9CPwEeLv0Y8Per8ZdKfVp7+M64GGl1J1Afg1bRH7Yr/QHIH791LMFpzUPadPiumeW8sFTTxwRmboyGTSlUR+P0Z7JUB+LReY7Bxi6MhnuXr2mzE4zbVn8/OlnOG3WTNrTaRoTiXyYyV899yzZEtvwnG3z9NbNbOvuYkpjYZnXtG26cllaEklMx6bPNBmTTOWXcG3HYVNHBw6u1tx2HDZ0tLN81y5ssdjY0cWhY8dRH4vx0s4dHDNhEs9s30pbb2+ZYrM3l+PnzzzDvyw4km3dPfTlsnRlsjy/dSs5e6ABiUugGHhK2H1Ff0TI2wasPHcoX/qPMDIYAKFVMCR5E4YUUvxx2OaD1cxmKuxTKHACoW1r1PzniziUqxIr+TT4h8X9UQq+wyr8ZvkS71kV4ggReCwtHD+Z/z71IrZ0d9BnWdTFDHSlMT5ZhyYKOyC4scugltiPpmXz18Uv8e7TFpKIGVx2/JHMGd/KH556ni17Ozlh9nQ+eOYJWJaDadlYjkPOtGmuT/Zb91Diz9c+TDZT7NuTy1o8cs8yPvyli6lv3L/yjDoM4cRXRO4C7irZ98vA558BPxtInbWwPt9rbJO3xb2tJiilLgCuwX11XSci3w0pcxbwYyAGtInI62qtf7iwp7cvdH9HOuN6te9Hc5nVu9r4wh33snpXG44IylDYMUHTFG+dP5+vnnV2ROAPAPTlTD53xz1lpN3HmrY9nPyLX9GdzaIrxZXHHM0XXncmGzs7Qp8jWdvmphUv88mTTkVE+NmSp/nV0mfJ2e4rR0TQlMbE+nq+dc65vLxzJz98+gnX+asSKh4qv99F4Lrnn+O6557LvxDz4c2GAnkTFfFMVIbxN1eLpnCA/Soq7sfPHG1E8EBGQNse/F6tbM1VS8BMZjSsloy01r/W9kvL9XOeQPUxDtqzl5QRcSAuSKy4qVpVBs+1befw//tBoJ2Aaj4fEtI7bNb2wxXgt48u4bePLgEUb1gwh3efvpCnX91Me2+aZZt38ruHlxDPgvISSGmaYvq4Zr7+jvM4Znb1pIdDhV3bOir2oHNv70FP3EcyK2ot6Jftich/DbbyQPD5c3GN9J9VSt0mIisCZVqAn+OGzNmklAo3mt3PGNdQz66e3rL9Y+tS+5W0d6QzXPmHm+jOFhz1xHTAAjMBt77yCn2myY8uvGi/yRRhcPj43+/gqY2bQl9CSkFXLlvkLPnnF1/CEeHkqdNZs6ct1E77J4uf4swZs3hm2xZ+sWRxWdQWW2y2dHfxb7ffimk7g+Ag/dkVFD7n42gPxDkuiNJxCX6uJYTLviBM5lJ5PBn6jRceqDJY1YiTr9caFG4iHLxrEuY1OQgIo5O012olM1KQ0LA+NSBsnIXCKlVIneL9OMWQGuO2l1YUMqhFdjdSxNyduIOytJqUB2ZgtfGBl9dy98urC9dLufdWNgWxHkEJOLawfmc7V//sFm7+8ruZ0toUWu9QYs/urtD9Zs5m/OTmYW9/tGO0R0mvWf+jlLrfI9n+9zFKqXv7Oe1EYK2IrBORHHAjcElJmauAW/ywkiKyq1aZhhNmBa1oJW3pcOHvy1aUyaJQrh2mAxnL4p41a2ivEGYrwujA1s4unt602TUhCbMFDYmdnLYsbnxpGe85+tiKk0UBvvvkI/xyaTlpDyLMaTPUfrzSi6wahluT7L3Y94u9e3/fB9nPmrTCwwAJ/lOCo3ubJsM/nuzHa1ZpwucKMfBqnZB6RhFGrWgDHesKkyNRYcQ6eJp7QO3LZL7iICoo0bjaXsCVgd7POcepSALtEh9Qy7b5y6MvDKj+wcKxK/fjnpsPbj8+ERBHq2kbKQyk5fEi0uF/EZF2oD/t+FRcp1YfW7x9QRwKjFFKPayUWqqUendYRUqpDyqlliilluzevXsAYg8OYaHowA0jtz+TVm3Y206mEiHzxIjpOjt6wsPtRRgd2NrZlbdZV8FU4QLNierhHeO6wZETJlY8vqmzk55cbkDyDAehGuVKiiHHkPR3PzEw0TwtshbY9gOG1bypesP7duoou5lHLVEPYKDXekiGeF+I+wAEEKUwm8CJFSbD+wRV7j9h2g7rd+zdt3qHAI/c/dJIizDiEKltGykM5PFtK6Vm+F+UUjPp/9YP+yWXnmMAxwNvBM4HvqKUOrTsJJFrRWSRiCwaP374097PGjsmdP+Mlub9aipzzNTJ1MXCwzP5P3zLcZjRHC1vjWbMHTeWrFVYOVEolKOIoXPp/AUcM3lS6HkxTWNcXR3nzDqkYt3HTZzMpBrjqvvw752hJPAHArkYddgPD3+B8sg2+2vCMBQkZ3AN79upo+xmHmXziFAM1FRmSIZ4X5y+ByJATBADrEYwG/sv3i8EVMnifSKmc+ycUr3m/sfbPzjiLoYjD6lxGyEMxKPxy8DjSqlHvO9nAh/q55x+g897ZdpEpBfoVUo9ChwDrB6AbEOOL77+dfzbjbeW73/D/r2pLzriUH762FPkulwPdPBeht6LOGUYfHDRIuq9eN4rtuzkidUb+dua5ezNpUkYBjFdY2xdHQunTGFKUyMnzZhBXNd5YuNGGhMJzp03d1DxwLd0dvLwuvXEdZ1z582lJZnk2S1bWbFrF9Obm3ndIbPzCSg27G7niTUbaUjGef38OTQkB57swbRtHl25nm0dXcyfOpFXd7bxxOpNzBjXwtXnnERdPMbtz7/C3S+tYvWONrKWTWt9ktnjWjls8nhmjR/Dnp4+Zo1r5dR5M7Adh4dXrmdXZw9Hz5iMoSkWr9/C9o4uXtm6iw1tHWgazJ00joZUnJa6FOccNofeXI6t7V1kLYtUPIbgpt1OxQz29qZZvm0nG/d20JXOsjfbS0akQJ4g/8IQXBOW65c+V5FU9WRzLPjRNTi+Da+i7Fd779pX0ZVCiaqdJNkFE24h4Gxd5IwZYoxfKqPgar2qWZBJ+ceyWoNL5mFdcECFRXUYjFmEb88+kHP9c7wQdTU/s4uGVdwl+KA9faksUrJvnwhoBeNobxMNcCRveldUJggtZH+1a+X32VdJBfsXOM+Xr0wRUmZGFtJGCYouZ9j5AxxHCbsu1VBarhaD9LAyVWQdQjP+oUFAZv9aykCJtH8/lvr8iCrcPxVt3EGyQIIyZ9L+G6WgrS8zgXOFEhuU5oDuoCZakNHB1JBeA0lrYEm/qwyKMqubfJ91s/BdCTimw433LuXvD73EO99wPJeeeRQxQ8dxhGde2cTdi1/hyZc30NOXRYBkXGfBrMl89wMX0dSQqrXzAGg6VMpPNWX68CtGRzdqC/U4klADMftQSo0DTsa9H5+qltnJK2/gEvDX4waffxa4SkSWB8ocgRsK53zcaDWLceNYvlyp3kWLFsmSJUtqlnswOPRbP6p4bPWXPzWsbZdib1+aax55kntWrUEB9akYbVaacfX1XL3oBC5fsADbET5zwx08tHYdfc0l64cl96AGoBSGUhie+cZ1l13KidOn1SzTL59ezE+ffAqllJum2nGY0tTEzp4eLMchpms0J5P85coruOHR5/jLM+7ym65pCPDz91zCiYdMr95IAFvbO3nnL2+iN5sjZ1lFDkA+mpKJiiZOPjQFyXiMMXUp+nImOcvGtGw3qQZSIMiEvBz7sXGWEntNwX2RScj02J14SVn5orbKzwLAMYrlKH15VCLvNb30K74rQ9+eqMpm9TU0FtJEKYEFlywXJT4aAiPmAYqFZ95Uq2NqaQVl2sjgPTbM7wgBN14XoMzwMv3a4Iddl2rnhN1slchsLeuyoeX6mXBQQ78qNJufaI/iKECDuheHGEXPGv+e9k2yajrfgxbcF6gzuFKkystIzCmLcVeZwFcZMCWhMivDwoiFnNdhYKyLk485XwX5s71iygIjQz7uvf+bLDXRqkvE+M3nr+DLv76T9Tvaq7bxP1e/kdcvLDNUqIgLFny54rG/PvFlGlvqaq5rMFBKLRWRRcPayCCROGSaTPnGR2oqu+FdXxqRftSscVdKPSgirwfuCNkXChGxlFJ+8Hkd+K0ffN47/ksReUUpdQ/wEu4c+LpqpP1gRGtdiv+68PX814UVh5pbnnmJJ1dtpK+1JC10CBwAEXIi5Dwt/tW3/oNnPnI1Mb1/lcnynbv42VNPlyXYWd9eeLjkbJuMafHhm25jy6b2gJmI+/djN9zGY//5IeI1hrH8/I1309bdWzWUYX+kHcAR6Mua9GXLGUw1RZ/4/1VQQleUSq/Cc0peSP3b1ioE0ByqxpeuRQtU9WCthKCyQmxArRa9qIMrCz40UFXDQe4f7UjJPKtfBK9zUPb8vaTtH8kV4DiSX5ovlkVcn4sQjXjwa38EuQxhZSqdN8D7bVB11HhfB4ehTOs+2lDrhGc4RShhyTKg5ahAF5zCJDZYZyUn1fw97EcVCpJ66Uf7HnpMhcSRd1fIVNgMqclC6fF8SMdqyP+kvHtJDAq/L6tEpMB9ms6afPiHf6OzN9NvG1/45Z0888u56Nq+zzSHm7SPegijXuPe71VWSiWVUq3AOC+STKu3zQL6DToqIneJyKEiMkdEvuXt+2VJAPrvich8ETlSRH48+O7sHzz99NMjLUIZ/vb0y/TZwan7wOCI8OyWrTWVvW3Fipqi69girNqyuyyRFbjPpsXrttTUXkdfhuVbd1aPPz4EqOlZP5CxrUaug8u0tQrhHx7OsIgDgap1OPqbSNRQywg8R/1ILKIGZ6c9UG3vcCKMtOe/j+531NBhAP0sm1xHKEfI2OQzqA4BQk29SuFoZSR9UC5ooTKrEDuXwiFqIO2hp/qvTl/jHla3h1pIu1/VS69uH5Q8paimjT9oIKq2bYRQi7rzQ8AncUn6Ugq3VRdujPYIowCWbe/zfVSa5rliOdupPbJOhWIKsGrMrumEhDI8kDEQpXaEkYGoQmIXH05W0Af5sh5pjFh0lwgRIuwX2K+x9+SIYpS/oPvVuIvINSIyG/isiBwiIrO97RgvVetBh5NPPnmkRSjDxcfPJ6UNPnuqI8KJ02qzcb/o8MNIxmppSxg7to6EUW5+YzsOJ86pzca9taGO2eNbayq7L6hpJb7EqiM/+Q47qcJzVKA4LXjFNss1vaW20q6jckEr7P91cIr2+2WdgFCC4GiOu+HktcuutX/1J5e7JF5dE+3WLzi6U9RuaF0hn4MlBvIgLR2TsmPeOFVqz8Ej7ap4k4RH6ClYTVWXw703HFUU/XP0YVQKNQwYgEnOaFotOZCQD5yw7xVR0w9NqxwnfUAInddKZUcCAfTBNSyBxFL+86GopsCXVCI8olwYjj5k8qDkKcWYo4ekmgMbpfdfpW2EUPNPTER+qpQ6Uin1L0qpd/vbcAoXoXZcdcaxHDZ5PKkeVXxThdxcGqB564kxTSNpGHzvogtIVQg7WYrjp07h0gXzSRkGCjA0jbiu05pK5UNXGnENOwntRoZsrOBZGNM1kjGDb15+HnXx2h9K3/2XC2hMJqpOGGJ6bbdzKmbQlEyQisfy9WlKlf0YyoZQFR8To7ARKybw+XNs17ax8Fv3jvg7SxuSALnM7y4mmY7hkXPDQeKCGILExP3s/SVOYX+sQOSJg2M4OLp7Lgbu5pc3xHVkVMXtBiXKy6GXk9+ihD8aSBwkBpIEW3fKJiNln1VJHQiOAU6sMOkolSe4z9YFJ+HGW3biuJ9LSLoTdzc77tZd2l61p6Lj3X7+6lbYJQSXqDsxt+/+GItOPhoUWqDwaEDIC2lU6+hLxy7MkaSf52DVegWwSvaNNlQiEmHEovRY6eda26qwT/qZxBfJUPK9qGqF+2xE3Pmy7dmBh8z7BcmT9kp//c9SOhZl4yagld8wSpPy2N0OqG4d7JIoXpXGPPBReUoAlfBuWP/Z4L0/gucYusb3P/wmWhv7jxjzycvPIF6TMq1//PnP3xqSeg5Y+BqXUWwqU3NUGaXU14CzgPnAXcCFwOMicvmwSVcB+yOqDMCib/2IYGLgFPDifo4oMxDYjsOjK9Zzx8uv8NC29fQ5FrqmoWsaDfE4h40fx+zWVk6fOYOEYfDo+g20pJJcMv8IpjQNPM3yC9u2c9+atSQMnTcdcThTm5q4b81aHtmwntvWrSxk6xTQcpCydD58wklcunABU8YMvL2udIY7nl/J5r2dHD55HCu27WLphm1MG9PMZy48nQlN9fzqn4u57+XVbO/sxrIdUvEYk1oamTthHLPHj6Enk2PuxLFceMxh5EyL2194hW3t3Rw3czKGrvH4mo1s3dvJqh276ejLoIBxTQ00phK01Kc467BZmJbDr59ZQkcmU/acVrb77mlOJMiYFmnH9kwufFLqldVcZU5eO6X8GtzPjo5LoMWziXQATXCCcx0/LXt/yL81KnwP7gt+90Iwinhk1sEN06aJ27ZHPlUOlKmKqpcY5TGWBch5Tp6Bh55PlsUgb0ekHO+56Ef28NrRTBXeJUWxlry0XzlQOoVU9iV9Vpb3PZhmPWxsLYrCUiqhKBRmPtqj306pLFJZiTdiCJFnVJN2H9XGsb8x7ue4338HCr+z0TQoYfKPxH3lT/B9HuP/ZgcA8eoJLnOUOlBD4PkQPFcTRHfca1RDKMpQR9Mimf2Uue4DUGkKTbdRuhcUoEdHumLoezR0WxX7iEhJnUBc14kZGnMntHL5icewp6ePV7e38cAzq4tNRf1zLWiMGZy36DA++bYzaaxLks6a3Lt4JTc/+hKrtuzG9rKeKmDq+Cb+50MXc9iMygn6wnDfrc/xw/+8uWz/sScdwnd/+68DqmswGNVRZWZNk0lf/XhNZTf96xdGpB8DIe7LcOOrPy8ixyilJuJGgHnTcAoYhv1F3CMMDt96/GF+98Jz2CX3VkMszg/Pu5BzD5k7QpINDR5bt4EP/unvoc6yghuu81sXnctF8w/L779/7Vo+fuedeafevGbX19z6D/8q5EAIEObhwL68+D0CW9WWuoomt1jjVqFQpVjuQwGpgZf5k5l90bQI+5amfThQS99HI/aFuAfKVOt7Xok6nL+7wcCfBI60HIBtyNCMjW+SRnl8dEH6DTOpgB9feBH/8dS99Jq5smOXzJnPNa+7eNDi/eXpF/mfOx8lExJsIQwxXefZb3ykLFLb//vzA9zy5LLQWzQZM/jv913E646aM2g5a8G/v/WnrFu1o2x/LK7zhwe/QEtr/bC2P+qJ+39+oqaymz7w+RHpx0B+bmkRcQBLKdUE7AIqp3OMcNCiPZ0uI+3g2g5353IhZxw42NzeyUdvur1qhBtHhO5scT+7c7m8Q2+egAdtqIcL+6ONWjEUMpTYne83hJkfRBhZjIZ7OsKQY7CO1IKwZNdWclZ4FLP2THqf5OrO5DBriKbmw3Gc0HwjHb3pio8RR4SezPC/I3u7w6PVaJpGurf/sMqvdSipbRspDIS4L1FKtQC/xo0u8xxusqQIEYrwhtlz87buQdiOwynTak+6NBrx66eeJWtZlVeqlRsz+5RZxf08eXrge0kG1aKPQ/kwKH3/DTPRqfWFW7GLNak+B3DOABF6TT0tu7/tU3SWUUz8R6lY/WN/kPdgEqAI5fA9r4cCUjCNKUN/q5EJ4aY1L2FKOVlOGQYXzqo9QVEYTp03IzTPiabCnwpzJo4N9eM655i5xEMCNgCICIvmDf87ctEZ4WORSMaYOLVl2Nsf1Qjzgai0jRAG4pz67yLS4cVfPxd4j4i8b/hEi3Cg4txD5nD0hEnUGYWHVsow+MDCE5jc0DiCku07nt+yPe8nFfzt+n+TcYOrjj+GGWNais6b0tjIB044Ie+cNNCY0qXRZIYEQeEH8hAq7bhnJjOQWOdVm1aED24l7Ou4SPnHfPOKPDEZMGkP68MoZsijWLTaUauJTAUzmdLrL4rafUmGC6U/Eql8aH/Cb1sFH4g1QMcNihBaofe3zDG+P6aiC0ZcI22Xa9uTus4hza1cOmdBbQJWwPypEzn/qENJBch4Kh7jzMNm0ZCM58m4oWmk4jG+/tY3hNZz3sJDOWza+HyACB+GpnjfuScwsaVhn+SsBam6eOj+WNwoS6p18KFGx9RRHsc9D6XU0cAs/zyl1FwRuWUY5IpwAEPXNG645DLuWLOK21evpC4W48ojj+a06TNHWrR9xiFjW1m9q60oAoDgRgs4fe5M3nviQk6fHd7Pz5x2Gq11Sf7fYw+HHlfAoWPH5p1eM5ZJ2rIQEcxS4h5of9AYbB2lxDronFlqn1pqr14ybkX7gyhjUAzfC6VkHErlEm2QdunBcarBnnrEUHovj6Qs+4JqkyO/Y4FjlfqZr0ajJofH/YYafqvDef3qDANLhJxt50XRFCSMGFNaGsk4Fjt7exBA1xTNiSSnzpzB4i1b2NndQ0MiwWfPOJ0zZs3khueeZ2VbG9ObmlizZy9r9+6lORGnM5elM5vNE3b/94cGMxqbSMVi7OjpJhmL0ZXNYjkOs5rH0NgcY8nu8gSCulK84/Dj+PzxZ5KsMUt3NXzrbefxhgVz+fvS5TgivOX4BZwzfw57e/v481Mv8uKm7cydOJZ3nnYc01qbQ+uI6Tq//cS/cNviFdz4yAu09/Qxa2IrHzj/JE46bMY+y1gLnnxwRej+7s4+dm/vZMKUlv0ix6jFKNdi1HwnK6V+CxwNLIcipWNE3COUIabrXHr4fC49fP5IizKk+OCpi3ho7TrXQcl7QyYMnbPmzuanl/fvp33spMmkDIN0iB3m+FQd97zjvaHn/W3Vy3zl8QeKzysxtdGVwurH2fzkKdN5/1EL+eB9/yiuY18eVIEU3pSagIaxiFqYhafpzk8C+jtnsGzFl7sai/Mi6gwKpVFlIgwtgmPa30S0hLyHkdz8z8GPZjRCUMCyz36MhGHwx+de4L/ufahq2bDP1WBoGkdPnshzW/vPtmloiuktLdz9ofeUaYkHiy+dfdaQ1OPjAw+E05CUEeMNM+YMCWkHV3lwzoI5nLOg2Hl0XGM9Hzvv1JrriRk6l516FJedetSQyDVQaGErHrimgZp+wE7dhw5D+KxWSl0AXIOrBrhORL5bodwJwNPAFSLyt6p1DiCqzAoRGRUsbH9GlZnzgx/mP7/6mU8Pa1ur29rY0N7BvHFjmT1mTH6/iPDPdeu4e/VqNnd1sivXy2Fjx/G6mbPY3NVJ2jRJxWK85dD5HDp2XFm9a/buYX37Xua2jmVjZwc3v7KcWS1j+MiiE0nF4jyxaSNPbN7IMZMmc/6cefnz7l61in+/747894ZYjFOnzeCkqdM4csIkFk2Zyu7eXl7ctYO4ppOzLdrTaTZ0dhDTdOZPmMDsphYeemUdt734Cl2ZLPPGj+WqE49mR2cPj6/byLj6es6dP5d/rlxHbzbLolnTmNHawgkzpxE3dESEf//TrTy0ZiMAcU1j+pgm2tNpLFtoTCboyeYQhDPnzqbPzLFhTwdzxrVy2XFH8sr2ndyzYg1rd+0p45QVEXhuOVDZxrX0pxNSLqaEjAaOH0IRUCFL7/mqQtqRYAnd+zjQ99BATWFqgV1edsgydPq25cNRd1hb1fpse45Iea35AO2cAv1QQ2kPHIZSM6xBrhQov668PUSg/kp1DmQSuC+ToSCEQrx18CZ7gcPB1ZLS6xz35LAIvZf9kKbihxr0r6VJdYZsUCD9vnwDvOaK4nmDXXoQyvo6EPh113oJqln3FdUxgOdSQzyGUop0NoduaDQkE1x8xGHMGjuG/338abqyWRwcjLhOTNeZUFdH2rLozmU5fPw4NKXx/PYdZMWirt6gM5YpG2YFxLM6ORFiSrFw0hTWtu+hLhYnoWvEjRia5hLWkyZPwxbY0tNJKmYQ03XGJJJs6mtnadsWslkbu8NhfKKRTx57CuMaG6iPx3lq9Uamj2vhzYvmo+sa9724mjuXvkLOtJk3eSxzJ49jfHMDi+ZM4+WNO7jxsRdp7+xlz+4eJoxp5B1vOJb12zowNI36ZJyp45s59rCp6CXk+u4nXuHBJavImTYTWxs5eu4Ujj9iOlPGh2v2q+Gm6x7h/37xENmeYifV2fOn8ItbawuFuC8Y1VFlZkyXyV/4ZE1lN370s1X7oZTSgdW45uVbgGeBK0VkRUi5+4EM8NuhJO6/AX5Q2uBIYH8Q9yBhL8VQE/g+0+QDt/6dF7Zvx9A0LMfhtJkz+OnFF7O7t5c33vAHenK5Ihtix3/plOCkyVO58dIrUEq59d7xd57bsQ1dKXpNs6x8YzxeFOmlMR7n/ne8j1N+96t+3zV1sVg+Fm3OCaHFArF20AaYSk9TioZEnM+84TS+dsc/B3TuUMG3bxYoHudSchLWNeUXcZd6HT+5Rj4REOVL8CGqvyLC7iO4fF/rW3s4SHuwXICMDilxL/0+GDvzgbRTwcRCQcFBNYBaQl8WwfFyvPj1DTMOaLOXSii5Xppd+FzVwTvsfqrWRMnk2tFKJjM+KgxwDUX6RbA/tfwsw0Qb7BwxeG5/PuNl+wawWhEqX+BZCVT0MyjLimwIdmNgNuMApqr8Oy2RUcLChMRt0ALiCMR2GWgZjVi3Qgv8jnVNYWgaWcsP+Vt8zBE3mZOywcgHuJF8LgjNE13XFE11SX76+cs5dMZ4duzp4vLP/5acVf7Q0DTFBaccwVf+7bwyol8NFxz2HxWP3bMqVCE8pBjtxH3K5z9ZU9kNH+uXuJ8CfF1Ezve+fxFARL5TUu6TuCqBE4A7+iPuA2FUvweeUkqtUkq9pJRappR6aQDnR6iAb/zzIZ7bto2MZdGTy5GxLB7fsJGfPPUUV/7lJno8Yq0oPIS0cg4OwDPbt/KTZ58C4JuPPcTS7VvJWFYoaQfKwjN253Kc/Yff1PTA7zNNco4dTto92KnyB2x/cEToymRHhrR7qiWlSrRMpSqnoEpMhRzHI3biXiu3vsA/T4urpMR+OlCPovgcgi+wgbCBgZat0J+K5TR/1xDSxFI5BtrnwbZTuqtIu1n8b0D1euMU9Geq1MWh2KCwAPSa2lRh80lT/jqF3Cdh5+W3AbSr5aMK1VaHFtj25Rr6nahFZvr5PtC2y+QIQajMA3jcl52f72PgX4UVsdLfo7IUWrcGlnK3Wkh7oPHQ37et3HvLv5g6mBMtRBPMhmKxbEfypN2vOn9MCm9BIx1s1ruweqEuyxHau9N8/Hs3Y9kO7//Gn0JJO7gRzB5YvIq/PvBCeD8roNr9EoFi36RqW/+YCmwOfN/i7ctDKTUVuBT4Za3iDYS4/xZ4F3AB8CbgYu9vhH2AI8I/Xnkln5jHR9a2+b8XXmR7d3fZOT4hrKS1+/2y5xERblm5guwA4s76CLO/HhQU6LkaSM5oR7UfaGnXVOlXVeFHrvA906uZyRRhX2xuh/sS7I/698dtVKmNoWjbu+T7w9b9AP/F9Y/8CkwI8kSsn/OrIeTZOirGdFQIURkK9im+tcr/V7K/hteYQqHZLoFXdj/vnRqWo1wFS/hD16kTdyLej/Ny6WRGVXm1ilF8TiZn8eSL62jr6KvaRs60uen+56sLUk22ku8XVtHGRyjDOKXUksD2wZLjYXdZ6S/kx8AXRKRmsjYQS9lNInLbAMq/ZjHnBz8cMnMZR6RiUofMIAl0xrJxPO//EcdoyxI5CKgal6prro99qG80vrhHo0yDQbULM1SE+7UyVgc6qlzP/TS3ilAjFKr2Vdv9deE0BmWLVnFSo5RraF+ya09XddLuo3c/JG06mDCAyWdbPyY/W4BgYP5pwLaSMouAG72oaeOAi5RSloj8vVKlA9HhrVRK/UkpdaVS6q3+NoDzXzMYSht3Q9M4etKksv0KOGXGDIxqdmsVHhonT52GrmkcO2ny0Ai5D3DiMmBTmdGGAZno19DVMAeqmrAvjo3DeQn2x+X1NKyCIMrbGOJ7q9ry51A5Ur4mDc9HANXGsPZl7IqnR9docBiOsaspjrtfbgjDdwoScEophpZxnR6qadDD4FRSlYrkTSb9Fk3L5uxF89D16p1XCk4/NkpiP6QYujjuzwLzlFKzlVJx4O1AkQJcRGaLyCwRmQX8Dfj3aqQdBkbcU0AWOA/XRMY3l4mwj/jmuW+gPhYj7mVlS+g6jYkEXz3nbL55bnESB5+sOAahD8iYpvPfZ5/n1nvWG6iPxfP11opvnRWeOCIMoYk0CsIOOttkXNdpSsb29R08cAQa7LfdUls3KT3sXatY4TcuRf9L/v/StoO7Kra3H9AvOR6kTDXXC8V1+0bDASPiYD21EvmyclJeR76MZ3qxT5MEvyop2zVY28nwNoaintI6RxOCv089pJsSWrS8jirVQ/HvtciULXhP7u+xGYk2B4D80AyAVUjJZxGQkN9iXsNdsr/0r2NUsp8KabhkPEWkvF7DKTwavPeZ1q2hTND7BjB/9O8d5QUrCB7zG3AK8/pETOfqy06jpSHF5991dtWujGms4+q3ntZ/n2vE3fvBOXVUw7vONW39VSViAR8F7gVeAW4SkeVKqauVUlcPVsSao8r0W5FSXyz1lB0u7K9wkGGRZYYrJOT27m7+8PwLrNy9m6MnTeKdxx7DuPp6AF7Yto2vPPAgq/e0YYrjknYdmuMJLHGwHYe4rnPWjNl8/czX05pKFert6eYPL73AirZdTG1oYvG2LWzs7CAVi/HhhSdw9qw5fO2RB1m9dw8zmpv5yhlnc/zkKezu6uLE3/86VNbWZJJTp8/kHUcewyttu3l44zoylk3Wttjd20NXNoehaUxpaGKy3sDSNZtIB5xrJjTUkbNsurJZdKUxpi5JR18GB2hKJjDFIeNYZG0bXcD3fR0I/VfAxIZ6OtJpMvbg1KWO32BJVBmBAhHzjuf3Fb20xK3DAPE0Nz4h8J0e3e9SqKOfToqOy/4CNt/+xKgisRzoT3yA5ZWo0Bdh/yf2U168un2ZwsJy1tJu2LEwO9pqt4k/CXXCL5Dq7+Lls69ScLYL3kOVUOngKCZw+w3eGPrXrcyJsRKHqzDRzu/ylWlBB0b/rwoUHCrN8mi0zakmT6DfpcQbxYCTVgXrUAoMXcP0Hvr56xDi45In194xJyYDD5MbuM4abi4M26tZKY+4ay55VxZoXRpGr06jxDh67CT6MibbO7oZ25Di4xedzrjmOr74h7vZsrcLR4SEYTCuuY4F0ydx9oJDuPHxF1i+aSdORtBMt82xTSkMR2E7QkMizmEzJ3DFuQs5et6UvJhLV27mm9fdy/a2bkQEXdcY31LPJa87istefwzNDamQzlVHmC37/iLtozqqzPTpMu1Tn6qp7LrPfGZE+jGUxP05EVk4JJX1g/0Zxz1CdexJ93H9i8/x1JbNzGhq4V+PW8iC8RMHXd/PHnuaXz2xuMg7H2DO2Fbu/vB7ivYt376T6596ji0dXZwyezrvPPFYWuvrAGjr6eUPzzzP4o1bmNnawvtOOZ6YrnP9U8+xaudukjGDdM5kbEM9V51wDAsmT+DaJ57l7hWrSefcuPjNqST1yTjr97aTs2xOnT2DD512Al+760Fe3rGrmGgrKOVuCnCUuE5HiqKXT5mWuJa06roUwkoGJggDsgEtRS2zhXzBYOcEnBAHMKE8CZN/ainxrkVrIQGyXCmefo3aj/w4hclSiUT7/fFnWjb5iEDBIoqQlaVSVuNHqquVtO8v+HKGTYoCu/vjcpW4bH93Zlj9YaJUHSsBLRcoHDaZC153AaxqNscUftPeOZqCpvoEe7PZapK4CE4mKJDLomPe1lpfR18uR9q08uIrr4AE7tNULMY582azs7OHmKahaYpMzuaUOdM5ac50bl26go172jlh9jTeeepxjGuo71/OAPpyJn99dhn3L1/D5o5O2nr7cAL8QFOKMakkh08cz6ULF3DhUYehacNzBzsi3P3Kam5+cTm243Dp0fN504LD2djewVfveoDlO3fRkkrxyTNP5aTZ07j++edZsn0rc1vH8q/HHc+8sWOHRa4IQ4NRT9w/WSNx/+yBT9yfF5HjhqSyfhAR99GBHT3dXHzjH+jO5cjZNppSxHWdn5z/Rs49ZG7N9aRNk6fXb0YB/+/+h9nc3llWJmHo3Pfh9zG5uRGA+19Zw+duuYec7TrixnWdxmSCWz/0DmxHuPRXf6QvZ+blcn0FBNsR7JJ7PmHooFyn3iDypSot/YaQ9WJtlOBouIleKkA8bXuYRsk/XqRR1wBdKpYfFMoeAcUafJ/wFskhFUygfIIqRQPhrjiUZpTJE8MKHfEZTH+Mzl/aDMhard4yWfx6Qqov1O9ebGX5Cx4qUEQq9wGKtO1A0cRmVBB3CGfGIWMSxoX7I9VDqZyuCAc0397YF7JkpS4vu68RtspNmINEvXRi7h+XCmaK+Y6WXO/gLSyqeLJQOraK8tvej4uugBgaVjA0oEBM1zBtJ39OXNepS8T420fewZSWphBBy9GXM/mXn/+JbR1dZEyraMJQ2kfluG0smjWV695/WU31DxSfu+1u7lv1KmkvjHEqZjB/4gSe27Kt7B7U4wonoTAdG917B1335rdwyvQZwyJbhH3HqCfun6iRuH9uZIj7UCZ1Hm2LfRGGGT9Z/BSdmUw+eo0jQsay+NI/7y/S1FTDP1e9yqnf+xWfu+VuPnvL3Wxr66x4J+WVno7D1+54kIxl5dvJ2Tad6Qy/ePQZfvLQk3RnskVy5WybnO2UkXZwCXspaYfAe6uSqYUqyFR8gv9VldlmVqqnErMJEkKFKtYsD9UvToV/CcYzLpWjkslI//VTMHGgn5BtJaSpIqRc1qEOQepryktJu99eNdmKSHuADI8a0g41CxO8JLVeniHvZ+l9H5i45RsMmXSU/Z6r/H7ypD3sQoUF6wpo+YOWbKVjpKpc/7Ky/uZNBAQwQ+J5m54poN+dnG3Tnc7y0weeqtzBEty6dHmetFdEYJxzts2Tr27iTdf8nq50pvI5g8CKHbu4d+XaPGkHSJsWS0NIO4CVE0zv+W2LkLYsvvzgAwyVUjLCwYV8fpUatpHCQC3CqmFUvYeGCnN+WLBzf/XTw2PfHsSyHTv4y8svs3jLFhpiMRZOnowpQmsqxfFTpjB33FjuWbeGdR3toGBSXQPnzp7DvNZxFevM2TZPbdlMxjI5eep0mpPJouOv7t3Dyj1tzG4Zw/zxEyrW05XN8NSWzcSUxtqOvfxt+ctYIY/SrlyW3zz3LDv7eunNmZwyfQYnT5nGTx58kiWbthLXdQxd55DxY7hvxRpyJTbomlNu+ZC1bc760XVVx85yHP68ZJA5wSqZC/jHhOJprrcv3/tKLMZPdx7MeJqvQmoi38VmMFKobygeHPtSR622EUGiVKpBr7UdcG+KUlVDqXa/FvjReYJaxaBpRamK1lsdGGgEiQMOIddlVD7Ug9cKPN+DwDFvXxgUIP71rFS/f65/rwV+t/4ErmLE5Sr39mBu/TzsANmvoRJbhDtfWMHY+hQ7O3tYunELe3r7AIWuNGaMaXJtuUXxpmMP49ePPFtM2mt0C3p1117e/5u/8dE3nMoJs6bxys5dtPX0cey0yUxqbkREeHnbTtbvaWf1zjZEhLcet4A544tNWV7csp1/LHuFPT197E2nyQ0oFLKUPRs2dnZw0/JlTG1q5uRp0zE0jX+uW8f969aiFExubGTR5KmcNG06WkD7srW7ixd3bWdifQMLJ05BqdHxCxARVm3YxdZdHcybMZ4Zk1uHpN5ffvsfPPKPF5g4vZX/+dOHiMerLA8fTBiIYmoEMJSmMl8SkW8PSWX9YH+Yypz44x+zxyl/etUBy4aBwHdns7z9L39hZVtb1XKC4MSlxMYZTp82k+veeCkJvXgu9vyO7bz/tluwHNfA1rRtvnLG2bzjqGPI2hb/ftftPLllE4amYTsOR4ybwPWXvJXGeKKonj+9/CLfePRhlBpEfHkb4l2qsnlFWR/DMVw/pbD2imxSKwhRRNpDVHu2JhALq7ukxX5MZYrbF3e6Xau6sxpCB7qGCisRcygm0hIsImXMpSateJCIhRDrwWjWy8eUyo6pDmjWADTs5Y0VbNvDvo8m1Ejc94vpSyWErTh55ht+6vggyuQs0baHWgcFnq35OaFWUibk91pKzIdq7Ipu+/2k5RvoM1jDHatYXEc3dEzb5i3HzOelrTtY17a3LKfIGXNn8et3XkrGtLj8uv9jTdvefKP5tmvx+8H9PdspQu0HkoZByjCwbIdus9g3QSkYX1fPny+/gpnNLXz5kfu5ZfVyYpqOIEysb+BPb/oXJjU09i/EMKKrN8Mnvnsz67fuQdcUluVw8jGz+NbHLsYwBhf/sqenh7cd942y/e/9zIVccfXZ+ypyvxjNpjLJadNl+kdr43hrv/jpEelHvxp3pdRPqfK4EJGPe3/3C2nfXwgj7QC1pUMYOL76wAP9knZwSYOWAydRUBkJ8MSWjVzz7JN8/uQz82WztsV7b7uZrhJnqm8+/v/bO++4KYrzgX9n98p7b4GX3rsUUUAQEVGwRQV77z3GEntiotH8LLFEY2yJJkaNLUVjjwV7N4iiqCiiiEiTXt96bXd+f+zu3d7eXnt5GzBfPsd7Nzvl2Zktz8w888w7jO3Zixe/+5b/LV2csbvqV2tWcc07b3H7/tNSYfPWruH6998hZjRtyDFYV7zSbp1j6+K1M8150OeQdBJ5XhpS2Eq7T3qvfbRfer+4gGWf3Vx2FnlPvMR8/MwPXPk7nmcK2oP75Q1W/Rh2fWym8pJR/1L6mr9YB61R9qw2KPUccClswvO7PZHDxMQvWrvAzw5GJzU6nTNNIaVd+ER3NZi7HfOJ1JTjedO04tR8qXKaABJiMQNpWA3w1GdfWcd8BgffX7CIf370GV+uXG0p7a5CM2Y1ilDeLZNE/8qJJpP2QFN2o0sJqxvqOev5Zzl7/Hie+24eMcNIvQ8Xb9rI+a+/wNNHnFhEDbQcv3/gNb5bsjpjbcPMOYt49IWPOfOI3ZqU50m7+atrD9/2cqso7u2edm5lVYyN+yfAp0AZMA74zv7shL+1n6JEkqbJS/Pnl5bIzP752NxMM5H3lyzGNLOvwHjS4Imvv+LxuV9mKO1gmdW8tOBbDFfH5cmvv2r6LqwSywtH+3nd50W4vxQhctZL1Z7GN4tcPZJSRD3pcz44ihyFSlHsA8h7IoXkyJW+wFBdxnXg5J9rtNsrg4+p0mZtSuXIk8vUxsnbm78J0vSYORUaorTzkfnMi/LVeantsRm02zs1Tx2Xai2VK5+SZGntl3sh+dpCJj/s+9mUMu9apwdnfMpLX32TX+YizqmquonmHXavbHltLfd98QmNyUTGYUNKvlqzitX1dU3LvxmIxZO8/+n3mQuS7fBn32yiWSgQj+YehHv+0Q+anO9WgWTLt3GXUj4CIIQ4HdhbSpmwf98LvNai0rVTZs6cycSJE5stP8M0i17MmQ/vg6c+Hs82CwBMJDWxKFFPfIekaZKUJrqtKdXEos0i31aN5wWjJ0CaYIYoXiHwM0HJ0HNboQ1yKY3FnkMx8fxexu4ycinzrjCRIGOnQRnOUXYeRVmLY3nP8M42y8z8M/KRVtumBbE2VPFFgpYAZ1IFSC1mFp54vvUuchxzZGm3GrYPLT3FUEreXpuW1iizNRDYrkvx95rUzuRtTCRSJpw5McnrF14Tgl4dO7Bh7Zomy6EJqE/EcxzTqEvEyb3yq2VJGmbOS7Ux5v/+3lyWLGx6XW41tHN1pxSvMr0Bt7FXpR22zdGcSjtAOBBg+27dSkvk03JT+g/K+D2pb3/rweihPBhk6pCh7NF/QMbCHIcdu/XIsJXff8hQyoO5tJMC2ApGqyidzYB0fylFZNdMrPUR1kxDic9WgUcnk+5jonS5iiWVZ463aLFlekeOvR/XCHlO7y+e4ylvMSZoMdt8xSTzaK4Oh+N20nNci1thfrbtjtIuvBLairi3XCcvbxnCnqF39CgNfDcJcuJktbsrbr7roqnXahMPl06uDJuroOY6/1LyaC7lvzmR1uxm6nr0HGs1itQq9hk2hB16dS8sWx7FfseePThw2LD8O3gXyFtDcNCQ4YS07B5CZSjEwI6dmpZ3M1ARCTGwd/ZCVE0T7DZmkE+KzefsKw9qkXy3KAq9x9p4dquUq/1m4DMhxMNCiIeB2cBWZdfeltx8wAEEiljBLpFIn22dK4Mh/m/3vTLCulVUcPGESUQCgVT08mCQnXv2Zt9BQ/i/PfamQzicUtJDmk5FMMTv99kvI599Bw5mfK8+TVbeExUyJbvPCWV+lz7hzY23jHxl5jmWce+K7PeLQGT6lpbO13R9pHyzk+v95NmG2+ur2ltnxXzPF1YK3rzM4k2istxceuTxdbmoi5Ry4k3vjGx7z0UkSY/UezoPAmHZ3rvNbcy00p5Zvv/UaCqWY0nmPgefwURH+c7oIObKs9DvXKPx+Sjy2s+bTaHrxXtd+L3omnLNuSvC285OB830b6esdM5Xv+ePK2/3/Z0hhxPPub7y1UW+50oBGfPivd7d3nXcHVbTHkDIdb009b53f3fawV4jEAkG6Nmhikgw4PtEKA8FuWLqntx6+DR0+772yiOAoC58910L6hoVoSC/O3BfThszlgEdq9FzvD9Duksh95QT0DRu2nd/Ltx5It0rKogErHdhQGhEAgH+uPdU38Gt1uSqnx1ApCxI0F6IGg4F6FhZxvnHT25ynhdcf6RveJ9BXZVnGdq/qUxRXmWEEBowEVgI7GoHfySlXNmCsuWktTZgcruCdGhJl5Ara2u57f33eem771K25yFNI2SvjB/Xpzf9O3Xk9SULWN1Qj5SS6nCEadsN47yxE+gcKffNd/aK5Tw+dw518TgHDR3O1CFD0e0RivWNDTz21Rw+X7WSEV26ctKoMb6r6A3T5NWFC3hx/jdsaGzkh43rWd3QkHoOCqB3ZSUT+/RnTWMDK2prWN1QjyElQ6o7M7S8E6998R0xt+tH58XnPJlNV2bO31KfmW6tSPqkz6cwmJYCYAYAnUy72RxdXLf3GX+LDIkRJMtzTMrLimtaO1f6lByOg2iN0rrcxSBzSZArrk90uz3zbqiUeilnx0nVSa4OgASt0S7W52Vqkt6lVthtCaQ3vdHA1O18XHI65UqfY1nl+5iGOpeZxM5fc+fjH98UrhdAjjgOhY7njVhsxu6TKDKrvGU4GZieMLc5lN0mvoXlum/d302shahOPdrfU06NfDrTXsXNa7IksWSS3nvM/VwRdlmuR5np5+lJZqbJOn9vZyCVGcU1gHMtCtAMUt6KJJb8UmKZmUj7uCOnd62ITvYFZbdNQKQr0TDtIQSvCZmdNqhpHLbbSNbVNzJ5uwEcNmYk6+obeHzWHP63cDEra2rRNY2fjBjCr/efQrmtIK6tq+eGV9/m/e8XE08mCekBulaUM6BzNYeO3p7BXTvz5OdfsXTTJsK6TtI02b5HN04YN4YeVZUARJMJnvn6a56Z9zXrGxuIBIOUB0MM6dSZE0aNoioU5rdvv8GXq1ZhYtIhXMYuvftw/oSJDO9iuVKuT8R58puv+N+yxfTrUM0pO+zEoOq2G213s2pdDU+/8QU/LFvHqGG9OWzvUXSsjGxWnp+8/w3XnfswybjVoFOP3YWLbzymOcQtSLv2KtOnnxxwTnF63vxr2sarTNHuIIUQH0opm7aEuZlRO6duHXz6wzLOefg5kkkjtYmIm/JQkL+cfjgzFyzhwfc+Ie7eJCnHi23u7y/llTnf8tsnX0ttIV4S+SxFfGwtpQAjl301IIXELPM/ZuUrcy44lc7xoHS9bIvVzkR2UK7khR4Bfsdz5VOE4l5wVN5RBrzRTAg0CldHJn82TSKX4mrLpJWyRjtfx7FAtLztVWTRvsl9C/NJWAhnZNvv/Eq49HKK4LPuIOVGU4IWzdN3la5PrnL9FHcfmaVbjs287jpXltMQi2dtchQK6Lx0xRn0rLYGTGZ8u5hLH3mBhnimnV0kFOC+s4+iR3UVx/3139TWx0g0GnnFCWgCKSWGT7sGdY2TJo/l8f99kSVTUNc4Zc+dufSgPbLSnXb3E8z+4ces8MqyEHeefgi7DlU7liry064V99795MAiFfdvr23/ivt1wBzgGdnGW5K1luI+4fTsEfePH26+Efd5i1bx1qz5xBNJZs1bytKVG4iEg1x28j7sP3FERlzTlHz49SI+nLuY9bUNfL98LUtXb0QIwQ4De3Lt6Qdw1e/+xTdL6xCAEYJ4hYYMCoRerPkCdOkQoTwUYvm6TSRboZWbu4gMM4Qc5Qny6y+p9MIT5nX5aIdJAUYQa4GkxBr1NaU1KudaLGYKfDZhAqlLzAhI90JWW1HR6yxFNzWK5mzHbg+ESU1m7WJqhiSyTFo+yBPWNLRpSoQAzTYNkYCQAmFanQNHmU4GTWuzAu+oYdzyZy5MMCqk/4IxCYG1lvW3GZDIkO0D3ZRgCPSERDOsjA1dgi5SdZQ6H/vckh1Jj1DaMoTWgh61FHdhh5tBMMusv4E6EPH03lTSHmHXE+lsjBCWz2dJhrtOYVjKoJBWnNSyffcodMJnoF8CCXuk12k/E7QGu70inrrEKkfq9nXihHtGY0US9EYrnuFMpLkv7gTotomGib0YGn9l1n3NJ8usSHrcrnfdqiORAHR7Ma1zGnZCTVqjtwL7PD0Kr/t+MwLWOWv2OgFpnwu61UaOv3XH65KWsEevscIk1gZsngHuTMzM6pC6NbuhJS2htYx1FB4hfZR5CalZGYF1n5ohEDG77oKuSgTXTJz9RfORyVOGE+7dN63gM8gbV2bGMQP2dR5KZy6SoEet7871YNpySjvADFj1FmwgNeXvlWtw7878sHy9ryzOpIC7jSw/7oKE7cksHNARAgIBnQHdqqlrjFHbGCccDGAYBjHDpE+XDvz8kEnsvsOgVN51jTGmf/IN85auYv6KdXy/ai2GYdKnc0euPuEnjBvcNxV31vdLueOVD/h+9XrqY/GMWVJdwL4jt+PC/ScxuHvmhk/L1m/ihc/nUdsYY8qIQew6uB8Any1dzpvzviccDHDI6O0Z1NUacV9ZU8ttb33A/DXrGNmzO5fsNYnFi9Yx8/MfqKos44Ddt2f56o0898YcVq+vY/shPThm6jj69qjOKLcxGufN97/hzffmsXzlJjpVRzj+8AnsOWmY72ZPjdE4b7/7DQsWrmbwwG7ss9f2lEeax5TltMlXsXpRpsecl5fe1Sx5F6LdK+5nF6m4X9f+FfdaoALLes7Z41hKKTsUSDcVuAvrVf+AlPLmHPF2AWYCx0kpn8qXZ6tswOSjtDs0h/J+9xPv8583PiMW9x8VnjhqAH/65VGAtWnShX96ljkLVxDNEV9bnaTM9VJyFJfGrhoy4Gg62zbul6mfAu93J2RtxGR/NyGlvJouzyTuF0cqf2G/ZHWyTXDsfCSWomuGLNMYLQFaTKSUdlzprSl9iRACP5/ifmsJrE2R0nHdcbx+5SUSo9LSYrS4QEStOAJr9M4MS8zybO1NxCBUo2fnL0EYAmFmvOazZHRkkdKqg2SlpdyKJAQ3gh4XudtKpEeA/drUL128o5W/FoOgx+ObGQAzYrWtlrRMdGTQpWzb56XFSS1AlprVgQvE0mUaOphhLA0qaSulzuSSrf0Iw1K8zKCtHMedRbB2vsKa1ZG6lVaLZ4/85+uMuq91vzRZYdK+Zp0mdnvzscOd88816J4rf2+4W+58nenUeXhH0lM3h7Q6Iz4FZoS5vnuVdz9lHrsz4fcMsDqbIkt+rwJc7PkVhcz9MxmyOlnuzpdf3LydohJEcKc1IbOzWyLTxg/npjMPZPHqDZx62+M0xuLEpKs35Cr49H125tLDpnDDc2/x2IdfZGbkfV7bXHP4vhy762gAXpnzLVc+9RqGNEkYJuWhIJO2609VZRnTv/qWaCKJrmnomsaV0/akb+dqznzsabyqUrdlAnOTQTCgWe4aXfcGQEDXuPKcA5g2eSQAq9fWcs4v/8H6jfVZee08pj+3/+7YDOV9zdpazr3oEeob4kSjCSJlQcrKgvz1rlPp2aNjCbWbzbR+F+c81hrKe7tX3H9WpOL+u7ZR3Iu2lJVSVkkpNSll0P5eVYTSrgP3ANOAkcAJQoiROeLdArxamvhbJt8tXZNXaQeY+eVilq7aAMBLH87Lq7QDhD0jSQLrJR/eWOTe1dsAPu9e37DUD+9BkR1XCtKmLiIdLZW/uyDdPw4ShBBoCUGgXiNYp6HHtJRC7cRNKWuC1APez+xE+PyzognXSzfLZ0oqXJMawVqdYI2OHtXQcMsi0GICLQbOrADSUl6DtZqvDCCyvLT4yZgqQwg0BKE6QXijIFRrLSL1KhwZnxwKWa5mFECoxpa7Ljs/PQnBWghvso7rBgSi1nfnE6hPK9jO/RaIZZapG9aoZrDOSi9MVyGa1aYaEIhDqB6C9RBIZC6J0CQEo/bxRitPr7ze885sU/86yxkmMv8issOF53njLS9X/t5wr3z5cJT2jDZ1ZSxkjvJ8BPCWlbNsYZ+vN45wXa8+59GU8ysKkf3T+QTj6dmlYtulqSJkpd3Mk3z5k29ZuGIt1/7rdWoaotlKu+v7w29/ytfLVvkr7Tm46YW3WV/XQH0szpVPv0Y0mUyZZzbEE7z33SJemPMNjYmkNTNlmsSSSW58+W0ueOr5LEUbYE1Py1VjImn99cZJGiY33/8adQ1WT/6Ov73hq7QDfPrFEmZ9vigj7K6/vM6GjQ1Eo1ZPrDGaYFNNI3fc3bJeuJ9//vkWzb+947xP2vPi1JKWuAkhDhVC/NH+HFxEkgnAAinlQillHHgcOMwn3oXA08DqUuRpK/KNxhfDu7MXkEwWNpZ9/LXPAHhp5td5lXak9H2YCqwpcUXx5Hwh+VHCEJos6U4rUGYboyEINOgEN2oE6jSCGzSCG3V7VD8bP5eLJeF0emgm5cfJVkK4psjyi4xWMKrfEHd7xqvEe8LbC5t9jXnzo21fzFsczTCd8M83ZzPnh+VpxTZX70PCn1+Z4Z9JDhlM0+SD+YuY9cMyAj6uI6OG4bvJoCY06uM5fPrq9mLfPAghmPXlYgA++nShr9Lu8MyLszN+fzRrYdYGiqYpmfXpD7SktfJfz3+zxfLeIpDW86SYT1tRtDohhLgZuBj42v5cbIflow+w1PV7mR3mzrcPcARwb4HyzxZCfCKE+GTNmi17g4Cgrvvas3kpC9muqQJ5dqBQKFoLjy2skMK2e29nWlyJtKn0SjlsHlQ9bvGEgm7XPMXELQVBMKAT0LSSLpWCs0BF5BHQLTVLK+Br3vue1zT/3PWm+qxXFI8s8tNGlHIFHAjsJ6V8UEr5IDDVDsuH35XnPd07gcullHmHoKWU90kpx0spx3crdbOiZmZzbdz3nTAs503p5oQDxgFw5ORRKSXeFyF8XQlLwAhv2UpVa5N1L+a7OUWB4+6opXgj8SFVTFs1Zw5TFHeAdMd1fTZ7O3qJtcCxrWjOB3QxT8T2hNNZa88yQqb3l+bIj2a4brclSngW5uKM/Xdh95ED0DXvA8WFPbJ/2cGT/R+FOWQI6BpThg9iwuC+vunKdD3T37uLzuU+bhdt80A/97BuNE2wy+gBAOyzx/D0uflw4pG7Zvzee8r2BAKZKlogoDFlD/+FrM1Fay1QbddsRYo7QLXrezGrI5YB/Vy/+wLLPXHGA48LIRYBRwN/EUIcXqJcWxR9u1dz6Ql7EQrqhIL+D4tj9x1L12rLR+1Pxg3lgF2GEwroOfW21Gph0i8dqUOsWhS8vlryGi02b9nENM39cQuRUlZk+rc3rnCUSp9KkthpnHA7XlZ57pee64A3nuODvOQGKTV+nneC95BboRNOWd64AsvDSj5R/BojaS0c1aJWHbfJc7IZCk2dkpYZoCVd5hitcWFvTjrS13LqPmiWGy1HmB+2LVJGVs4XM70PUlZRPmX7iZIV5nPfpyO7b+xWotT7uBXIqOOMgNL42bQJ9OhUxdUn7kfvzh1IOULzabv/O2Zf+nWp5rKDpmQL44MuBHecdDAV4RChQIC7TzmU8lCQ8lCQcEAnHNA5cdcxnDtlAuGATlkgQHkoSFkwwB3HHsTDJx+VtTOrJgRdfxSEgzrlZUECupZlThYK6tz8i8MoC1kbF1541j4M6NfFd9DukP1HM3J4r4yw88/Zh/79uhCJBAkGdSKRIH16d+Kin++Xlb5Uug+s3Ow8tmbau417KV5ljsfaPfUdrEfoFOA3UsrH86QJAPOBfYEfgVnAiVLKuTniPwy82B68yoBly+5485NYZrbN4VFm6YZNPDTzU95b8AOJhEnXYBkNjXE2rm2koxbigmN356CxI1m8YSMvz/2WF+Z+QzgQ4IRRozEbTBqjcRauWMdnC5YjBOw1ZggXHL47ixet5NRfP47QLS8V8QqBGdQQ9oPC29ICsJ2NWMfs7yLDh1hxJN0u0wJWWhEH3S40qQMhK1yzt6yXOkgzbRssheVZw9kIKVXxhr9b59R32yWjZrufc1b2SayFfE4BRoDUKJqWsOK78zDtv0LY8WxNwPEkohv2+0NP5y/tDXfcLgql4/PNwPIYo5Ht+s+pc5cnBoEtv2f0Sjr/uzaG8fMk491QKKOSnN8yO20WMn3uGYs+vZvlOC9T2x1ixkLBtOCpc3I2yMkq3SlPpL8LM/09tT+MU57A//xcZWYYnHu1s2LwblKTC3d5XrHcyoxzTTnx3LuqSrIrxX0duDcmy3fuXln92r+UgTpvXbv8qGO7eCyYNld7FVu+635Oye7e1MmUiKS1gFcIgddheYa6ZdqJUveBP47rRABnZWrq+ehn6+/W2Eqt46zCfSrJfvmkPEzZUUJBzVoYKaE8FKCyLETSlPTsWoU0JBvrGtlY30gsbmTcOsGAlS6VvWE9WyJhSwE1JQzo2YkdB3Xn5ZnfUh9LoAuBkBKhCQIBnVgiSdKua4E1stytUwWBsM6ytTVoAgZ0ryaaMIiEg4wb0puVG+pYV9tAdUUZsbhBTWOU7Xp35aAJI9hY00jvrh3p270jb85ewB+efYekp5GEgN+fMpVpO2+fClu5qZZ7Xv+QL5aspKaxgTV1jalj1ZEwP91zF46aMIqOkczNNOpjcd78egF10Ti7DxvIgC7VAHy/eh3/mPEZQgjOnLwz/Tpb4bFEgoc//pyvVqxkp769OHWXsaxYvYmPv1xMZSTMlF22Y93Gel793zy+/mEV1R0jHDhlB8YP75dRrmlKZs9ZzEezf+C771fRvWsVJx61KwP7d/W/HEzJZ18sZtHitQzo34VxOw0sara+WNzeZSq76jz52eat3yuW9uxVJtKrnxx8WnF63te3FPYqU8izohDiMOB6rEdPErhESvlB3jxLUNz/AXwHbACWUOTOqUKIA7HMYXTgQSnljUKIcwGklPd64j5MO1Hcx990BzU+imsY+PK3lzYpTyklv3nhNZ6Z83XeeLqAsmDQd1FMj6oK3r3oZ3m3Yf5k0TJ+/uh/AWtRTmPUf7jSV8nAVmo98TUhiFSGSApJPJkg4bejh5em9EibYco1A8dEpdBUuk91pqbKfealnBd51g6L3uJ10sq5XyaFdGhHU3LKSv3MVtyxZSqoOHh3Js2hBAq7g5WBo0RJyy1hVlu5juNjHiSSrg6AE8ebh1epkpb3FcerSFEmDG5lsanXk0fhbNLr0l1+qUqzxN/Eyp5Nc/920myOSZHUASN976fcj5q2i0Fvu7TS4iyB5Vvd6fxqqceirTjaXna0uNUZz9odNBVdIuLpc/BrDuk9IASBgEYwoGOYJoGATn00nhGnLBRgu37dWLB0DZomkBL69+zEPb8+mg4VeXZfcxFPJLnw1qf4bL53QjrNUXuP5vLTfpIV/sBzH/Lwix/bo76CgK7x+wsO4c5/v8OSVRuIxZNIaSnXAU1j0phB3Hjegdz7zAz+/epsDNfmd5FQkNt/cTg7b9/PrjLJLY+8yYsfzLVttQVV5WHu/c0x9OlezeNvzOZPT79vlY1ACMGdFx3OTkP7ZMnpJZk0uPzeF5k5dzG6LognDZKmJBjQiSetzobhuFK1OXLijlxzgv+I87raBn76l6dYsaHGGqgxJXuMGMCtpx5EMIcZjJuZC5Zw0T+ex7npk4bJbw7Zm2N2HVUwLUBjLMEFf36WeUtWoQmBKSXD+3XnnguPoLyseXyvby20a8W9Zz855NTiFPe5t+ZX3G2PifOB/bAsUGYBJ0gpv3bFqQTqpZRSCDEaeEJKOcI3Q5tSTGUesv8eCtwO3COEuDhPfACklNOllMOklEOklDfaYfd6lXY7/PRCSntr4ae0A8Q2I8/nvpxXUGkHa9Ao10r2VbX1/O7lt3KmbYwnOO/R/1IXi1MXi9MQTeac0c0Ido3mmcFsXceQkk3RGPWxeHFKuyfPoj9NTZfr4/hYb0K5GS927zHXyGkumaWGpbRvhvzCzjzLn3wuCp0XZI5g5oonSY0KZ0Szt5l3lHZvFinM7CyzphYN/zyETz2Y3lFXH/GdclO+vn3yL+UyLErhb85OpidfR2nPks1PoXcp7U2+zZzOkascDCw/9dLTLmDP/GxGeaWktc8vw/2m/Q8NpJHeuCk1W+OpH0yRNXjvjWIdFOkPllu/xliCeMKgvjGelXc0nuSr7y13vQ3RBI2xBN8vW8vvH37DpxR/HvjvzLxKO8DTb8/hs2+XZYR9Mm8Jj06fRTxh0BBNUN8YZ1NdlIv/+DQLf1xHNJZ+/pumJJ40+PDLRdz00Bs88frnGUo7WO+PS29/lpXravjsm2U8/tpsps+Yl8q/IRpn9YY6Lrvzv3yzeBV3P/NBuuxonLrGGJf86VliRexa/cgrs5g5dzGxRJL6aIKEYblVdHbIFoDuuJ3FGjzKpwBf9dgrLF6zgYZ4goZYglgiyf++Wcwj73xaUJb6WJwLH32e+liC+lic+liCWNLg9y++w/er1xVMD3D7U+8yd9FK6zqIJYjGk8xbvIrbnnqvqPSKdoQs8lOYgp4VpZR1rk1NK4rJuRQ/7m8BNwL/BzyAZZt+XrHptyY+/bTwg8CPf33yebOU/9QXvpZGAHzw3aLMgDxTwvnwdV/YlIzammIV3nzkuI0KKXhmE0b5C0bLl8ZryuIX3/6dsUmTjwacazGtsBV6v3pN/XTMbLISY3WinFF2nzi+pydwbYeaJ510/XUr8E0gq23z5ZPrmHcSJNcIdZ68/eojpVS7TUbyxC82XyBt9WHPcmjJtC7rl0Gx1bu5t6Bvx8+N63klHFM79wvWtPdBKHVRX65rvABJwyza7S/Ac+/MKRxJwv3PZbpBfPbtOURj2UpyImmSNPwvuFg8yRsfz/dXriUkEgZHXfYgv7zjOe7897tEY5mDSFJKlq3ZxL9e+5R4Ivv8pISZcxcXPJ1n3v0yLUOeinUGR4IBncMmZG0DA0B9NM7H3y0laWaeczSR5IkZhev2nXkLfcOThsHzs+cVTA8w/aN5qU6HQzxp8PJHxaVXtB9KsHHv6ng7tD9ne7Iq6FkRQAhxhBDiG+Al4MxC8hXtU0kI8SZWb+BD4H1gFynlFuF3vb3QkM8XewkYMvccdWMi2Sw+Xr06j+HaHn6LYnM1mdYqv5T8NJB+trAtUFShg6ndNR1MCp6zkCCbeivI3LqX8PyVuJS9praDdwTa77jIccyTRgAyV/34zUYUQJiAaZuQNMPlIDzn0t5u90LyZIzsm666buLgxeZiSknSNAkUtNODmI8C7Mf8JZmukOsbc/gYL4BXwXVjmBITSbIxnm06ZKNrgrqGOKbPu0ZKSWOssFyxhCeOz40tgHBAx9Th0kP3YFgff49yXoU5s5zCD5toIul7LoYpqY8VtxlKLhniSQMpZYt6glE0M8U/T9cWMPkp5mmPlPJZ4FkhxBQse/dsmzgXpZjKzAHiwI7AaGBHIYSPn6Stn5133rlJ6aaNHNYs5Y/r2zvnsd2G9M98KIsmvNOFpQyY9scIUbr/oS2NfJVUrMbgDfabsm8K3l6UMwKteb5D08vzKJ+pBbaF0mjZQXmVWI8JjW8cvzD3SHuRI+nNMsrrzcczVZoaCc7xyRqo9saxTY9E0holFvb3fLebuy8iSKdtFkqcFSi2jlu6mynM7DKctslsv82TpJTUwwd0T3kUKcTknQYXFa++IW6Z69jst+twysLZZeRrl4CuscOgHgSL3R/E56RDgQCHTt6RiE/ZSdNkwvb9C2Y7ecyQTNePPm0T0DV+fczevHrdWZwwZWzOvDpVRujXtTorXNc09t5xSEFZJg0d4DvgFQkF+ckO2xVMD7DLiP5ZfQ8hYJfh/ZTSviVRrJlMcQ+DYjwrpouW8j1giBDCf7WyTdEj7lLKSwHHkP4MLJv3nljrNRUFeO/7H5i1ZBnhgE6syOlTL4aQEICZK5cx5I+3Z77dnRduHYQasR4ULq1DOnFKGH1KLQIs5iJ1Z+r3Bs11zBvPrUAKWm0BnLf8DDFNMpVjQcpTSs46kpZCJV3KrTBJefFx2kE65iNOmEwrzcJIj2hrEmTYOiZMO47bdt+w7H/NIJkLRAESlkccMwhSh+BG0But5alG0JJBT0CyklR961FLFiMCMmjZtAvbPWOqHjTLHEgYYDpr8KS9W6+wZSFTlgwF09sZkZ5wV5hWC0In2xzIk85RjJ06Eu6Oq9/IuNO2Mj2CnWob0uFC2pMJTn3bnoJSaxy8xtNOOXa7SJGWB3ebI9OKt2a1j7vM1OJnYV909jHNruNUnpBesJrS6J0L1ZM+acUVLs9KplOOcx3r6RkCYQC2RybH5CfVsbMXrjqD9WAdc0ztNOde0l0RXLKgCcszjHv2IKN9XeeQTNezY64lkWhxCDj+cDW78m3TmJRcWvpelPaia6eNs5+HVnnSHsCQmkiZiDnephwvUtK+/t1Vp4VAQ2PyyEHEEwaz5y5hzfpaNtY08tm8H+lcHaGhMc6iZesZM6IP+0wcxsrlm9ASMmOEWzrt7pZMSp5/6wsmjhlMImkg4wb9u3VkyeqNRGMJhAQdwZSdhzBj7mLiCcMaSZYShEAHdBM6h8vo270ji1duyNydU0rLO5dTl+7yDWmZTwmYtP0Ali1ZTycRxkwkiekmmq4RCuqcd/judKqKMG/hSn74cR39e3VmhyE9AZi7YAVLVm5gcN+unH/kHsycu4jahhiN8SRCpF0Xa8LaMOmQiSMpFzqJeOF35g3HH8BZf32KpGkSTxqUBQN0KC/jgmmTMuL9sHI9cxevpHt1JeOH9kPTBL2qqzh77125/52PiSetOgsFdIb36MqOfXr4lielZPZ3P7JiXQ0j+nfniuP34dSbHyOWSBJLJAkFdAK6xsTtB/DDyvUM6tk5lXbFhho++f5HOpaXsdvw/kUtnm0JDhh7Ter7jfefzfjxhRcVb+3kHFRqGrOAoUKIQVieFY8HTswoT4jtgO/txanjsPzv5V1YUYpXmQuAycDOwGLgPeB92/a9VWkNrzLDbrzDX8kUMP+qS4vOJ2EY7PeXh1heU5sOzFPlQljPS/f6TxOJDOHvGSXHNL0WhUAdeL2HNNvI3DZISslOBfgoJd40UHBzGH/lIVfMTHnMoKVQhGrSMcwya5ZEmKA32ra9riysBX6Z14X7e4YshkePynHtSqzZGd01Ky0FJMss5ce0OxwZNtRRu59gm2EJ0iOnjstNTAhu8vfOKANpRddRNnWPp5uUu9OAa4GrfR6OW9LmwtSsTo4jpO47w55WCk0NAvHcdZpKIay6dWy3C10rTv1JPVNvT43oF39KGZn61VXx166FYber5nSSfNKn2le3FWTpkjujQJletJrEOlmzwORgMa87z5vbUqZ91Hs7nvcR7I0ZCuq+tuDFiGYGQAbcwkj0qKU8CyEIhwIgoaIizLqN9RkmdBKrYy01u/5cLkgdmfv2qaZT10o21DYgEpIfl23I8EhphoBkZlq/cwQYPbovF5+8FwN7duaSW57i28WrcVxYDuzdCcOULFu50T4NyfaDe3LDRQfzxifzeXf2AubM+xF0QQKJNCVBXSOk6UgsDy8nTxvPuUfunrcOV22s46mZc1i0egPjBvXh0F1GUmEvaDVMk6seepl35ixMjfR3rirngUuPoUenKgDmLFnBHdM/YPbCZQTRCSIwJfzhtIPYc8f0rMj6mgZ+dtuTrNpQa+ct2XX7flx10k946aN5fLbgR75YsIKEYbW7aUr2HDOYG86cyl0v/Y9/f/C57YkHwsEAD5x3NEN75R1kbVY+fPtzrv3Fs1nhgaDgpY+vbfHy27NXmfIe/eTQE4rzKjPnrqLcQeb1rCiEuBw4FUgAjcCvCrmDLGXf4AiWN5lPpWyyheqWRTN0u3736tuZSnuBfCW2eav7We24ZcuV1ifMDIOZtFflpwILFq/Ihz3C6Iyyi9R/eZLYike+eMW3R2ZMIa2RV70hfVRgd9qijshp/+7ubIRX03CPcruxF5MKn7jeF7l3F0EhrdkfsNxTJ8vtEUppjejrjle9KCTKSc9MQNojjI8P/1S5SftjiyT9ZpSc3y7zk5a6/nWTlNup3E1uhQpToieKk0VItwvEIuKDVX/N2UnP8ewotS4DxdjuO198POdkxRQgA9L2/Z++OH3lKkJpT414uxT1XB2LQoqsQzFKe648tCQYWvqidrzqWIPoksaodWH42ZQL7H0sci00B378cSNTJ23P8EE9uPqulzLWrEjsmZ0csnmZM2cZ/bpXc/dj7/L1wlUkXDPL3y5aA8gMa5i536/g0ec/5vzjJ3P/EzNIJExIpEf7E4ZBwiX8v1/9lHHD+zJhhwE5ZehRXcn5Uyf5Hnvy3Tm8++XCDJv3WKKGK/4+nYcuOw6AzhXlzF2wEhKQwMCp1V8//BKvXncW1RWWdfDVD7/CktUbMFy9nI/mLeW/M+Zy1oG78u4X31MfjWUcf2/OQn7/xNu88MU3xJNGyia+Ppbg/Aee49Xf/rTVTGr8lHaAZKK4gdytnmasBinldGC6J+xe1/dbgFtKybMUrzK3Sik/2maU9jwMu/GOouM+V4T7x4LkU9pzoYHhcSHsHTVRNAGXi0TA35OLTVoJaFl5nGL88FPac84AFPuwKvV8pDXCGq6Dsk0QrrFHml1RUm7fZDpNKrxIkfyub69y1VrXf8FytiSbV5+OWpuQRwDHg9Nmt3ERiVu7HjTblEqPZ24a11w88+oXPPPa51neY5pynk9Mn83LH3ydobSD1cnwTu7HEwYvvTeXT75e6rsw1Es0luSZt4vwvpNLtve/IOpxEGGYkq+XrGJ9rTX68cqn32D6LNwVAt6aswCAhmicj79ZmqGUg7UI9un3vmR9TQNfL16ddTwaT/LiZ9/Q6OPqeVNDlK+XrWryuTUnh+9xQ1uL0PbIIj9tRCkj7oomYDTHtthNfVO0+Zt26yKHVVLLYdulthq5tf8WP3HNANFo29xraUWllG2l1eW+jSKa+QJtR50qp0Pakmt9YolkauTer/xSqG+IZSnt+UgkDKLxRNFrhhuixXl48SOaY28UIURKoW+IJ33daBqmpNGOk8jhZhOsuowmkjk3SDQM/7rRhKDBx61nWxBtoqeirQZZ2nunLdjafYW0CKXYuI/t1YPI8hiRZVHCq+KUL42iN2bfvJGlUTrNriG8PJqdiRO9lItJ2gsJ3UGiyCycxUyl0JQ0XkyJXhMnvCaGXpcsKj+9IUnZyiiB2gSh9XHKVkYJrrP+6g2FXyAiYRJaF7fKipv+ZUpJaH2c4JoYFYvqKV/USHCD/QKR5JTTZYqbH7/0hkRrNP23QHelE4kSXdfYdsD+x4qUr4UeasKQBKKSYAMEYu304dkcHfF8+TRX/lsjea5P99qdza7BbawN9pqwHfvtPoKy0OaP4x2x/xh22XFAUSYfmibYdfQAdt6+H8kcCq2bsnCA/XfNu6FkXn4ydqivJ50uVeX06mzZuO+142Br3YAHIQSTRw4CoGNFGQN6dMqKo+sae40ZQq/OVXTuUJ51PBjQGTeoD2XB7PxNKRk9oGfJ59QSPPjCOW0tQtujRty3UGIxCNm7tLk9G3h9z+ZhzkffE/3T1/RsjKZ2NXQW09UNKGPT3l2g0aD306vQ4lb+nebUY4QFi4/uDkGrXyWSpL1LOMazfoaWzjHTGqXRvX0A2zgyy+rZ9aIKbUhQ/WUNa3frjKlL0LX0yG+uv6ZEGJIun25iw5gOGCENISWV8+upHV7hrKTKX1lJk9CmJN1mbLC8mYQEa3bvTLJCt9J7vWMAZSuidPl0EwiB8Ozm6tRzfd8yNu3Qwd7F1HUuhokwoevMDYRqLN/3moSNIyqpH1Rhe3Sw8ihf1kj1F7WpreCd/BOVATaNKCfeNYQZ0hAxEzPibCdp2zIb0pLFJH0erroTCZPQhgTxTkGkJkAXiKREj5l0nbGR1VM6IXWJDGhgmOm6TFry93xrLYmqIBvHVtteP0TGOVplkvLeAaAZrpH81LaK6WsnXd92OQgwTetaMB0jWGEnt/0Tu8/LfT06aAKZz6xHSjAlWqOBGdFBc1/srjjuslJhdlRD2vWD//Xmcw2l5HSn8Z6LE25KSJpoSROzPFjyjEjqbOx8JSCSdqU47QvZ3jxyZtiCMzLeutaw20+mFhzCZs5y5KrnXDjt7C7c7og6C2edNSWeKyczPn7XkPPdFc8lmxTCM/Hkc70Xcw4tQDiogxDEmrBPSEV5iPNOmkJleZiX3/uahUvW0hhL+J5aIfbdbTh9e3bistP25Yz/+yfReJJYPEk4FCCga0gpMUxJLJ6kLBSgLBzk0lP2oWNlhEtO3JO7HnuPRNLANCUBTcNA2o8xSSQcZPiA7kzdremK+1nTduXtL75nXU09jfEkQd3y+nL96QekOhqjBvRk2rjhvDJ7Po1xqx7CwQAn7zmW/t2qU3ldd9r+nH3HUySTtgebUIAOFWWcf/gkhBBcf8YBXPin50iaJomkQSQUpEuHcm46ZRoXP/w8361YR2M8QUATBHSd3x23P2Efhb6l6N2vmuVLN/of653b3fS2QnM6LWgJivYq055oDa8y04b+mnXDy9i4a8fUA7rDp5voNjfKy9/9oWD6uppGTtnjRqKNuaf2Djp9Ei/960NkQma9ZAI9y+n+89F0KAvz0tfzMZCWrbvjLi1r5xubBAQaheW+DzKVp6RERE1ESLMUHButwaB6bi2xriGq59WjGRIzKKjrFyHeOYihQ7wqQKgmiZZMl2uGNURSUrY+QcWSRrS4xIho1PeLULGkET1mkgwJVu7Z2SpP1zzuQSQkoWxVjIqVMSIrYxmjrFKzFe/hFWiNJoHGJLHOYWRIo/KHejrOrSs4ZSSx7F8b+0SIdgthBgTClIQ2Jqm0ZXTiOTUS6xSkvl8ZZkCjfFkjkTUJ36p2RJVBgRGEQH2SRIVO/cBykhU6RkgjvDFB+bIoDb3LaOwZIlFh+dnTY5LQpgSVS63ZGCOiUTOskmRVgPC6JJUL69FiBmZIUDuknHinAKH1CcpWx6kZVkFoY4Kq7xvQo6Ytc4B14zpZC9KiJnpCElkZI1CToL5/BLNMJ7QuRmRRLfUDK4n2qcAo09HjBtWfr0ckJPGqAJop08eiBmXLGwitixLtU0myKkhgY4xkuU50QAdAIJImel3carekJLK8jkRnawFX5Mc6MCSN/SpJdApjVAatha6OaYPtq1GLGoTWRqlcVIswJNEeEaLdykh0CKU6rxgyrdjqVudFr08Q2BCzOjsSypbXodcn2DiqK0aXsoxrHEDfZE1BmUGdYE0MkbS8koRX1NEwqAOJbuXodQlC66LIgCBQmyBZESTZIQiGJLSqgciP9RAQrN+lO1LXIaxbCr3TYchzHUphd5klYEJ4VT1Vc9cS61mJ0TGMXhcn/GMtyaoQtTu34eibBGJJ629YsztRWOdpyNRv39MtpLhKq/PjzBZJSD8bdGG3Wf66tBI5AykmmiFSzw0hLTmF0zH2dlDt89DX1GJWhEEIZEC3Ok5250065+HIICVS9z5prNkw0RAn/GMNyc7lGBVBCAfo2qMaTRMM6tuF4w7cmU++WszCJWtZvnoTazfUo2mCeMIgkUjSoSrCdv278Pm8H0l6Bh8qIwEMU6QWnpaXBenepYpe3TowYfRAkkmT7xavZlC/rhyyzyhq6hq586G3WbJiA0P6dWFg3y68PfM71m2sQyDoUBVBAzbVRwmHAhy81w6cdtRuVESsAapk0uDtj77jw9kL6VxdwdCB3fh83jIMQ9K1UwVvzZzPitWbEJqgR5cqQsEAm2ob6VgV4fQjJ7LvpOEp2Wvqo7zwzld8u2gVQwd059A9d0Qief7tr1iwdA3bD+7BwVN2pKoivRBr/uI1vPjeV9Q2xNh7l6H07taBFz+Yy4baRvYcO4Qp47YjkNUOpdEYT/DyrG/4ZP4y+nbtyJG7j6KnPdruIKXk4/lLeXn2t+ia4JAJI9lpULYyu2ZTHc+9/xWLVm1gzJBeHDxxJOW2BxuAletrefaDL1m2ZhPjh/dl6oQRREJBEobBm3MW8O7XC+lSVc5RE0cxqHvnrPxbmut+8S9mvD0/9bu1PMoA7durTPd+csRRxXmV+ezewl5lWgKluOdg2na/yjlq9/KCWwumf/XJWdx7/X/zKu5l5SGiDbmP5+sgHLjrdRjOaF3CQDTGs991up532KRZRs1am7a4XguOormUSi+az4vGnZ/LxEgGdQhYo2c0xPKOTPuGO8qwrmfLLKU1au7eRdA1Cp/OowikBMNIl1UsAVvJ9S7+0jTrGGSOYjo2qc5vZ7bBiVNo91iBNWsmJSSTheMXi3P+AEG7J+1Xd5qwzk3TstvcNNPn19J4y/fKUSrOubrOWWiCG/59PuP23D5v0vmfL+biabmfa7qucehZe3H2tUcVJcqjf3iRp/76JgnPaHNZeYibn7iQ4WMHAvCLA//AvFn+29pn4enwhSJBzrr6SA45cy8AVi1Zx9mTryPuYxc+csIQbnvhsuLKUSi2Udq14t6tBMX9b22juCsb9yawcuXKgnHqaxtJFlikk2zC1KaD6VIURcx/RBhTOW1vFfIpP6V0NJq4MRdAamcfH6Uqnb/nettcPbbUdQ1SkrKXceN0KEzT+hiGv1JbquItSSvZzaW0OziKsGF4zG48351zcurK6XDkWeDW7Pi1U1OVdvDtBARDAeprGwsmrVlfl/e4YZjUbmgoWpRpJ+9OIJjZeQwEdfoM6s6wnQakwuo2FZ+nl2TcoL4mfW71tY3oAf9XZ/1mlKNQKNoJsshPG6Fs3PPhVXQAdJ0ePfx3UnOQUrJpXa2lmBuG/wgoMHzsAObO+iFVlgRryjgYBCGYOvJK65g7rW7bFjvhUkI4mL6GTAlJI/fiIN/Fl3lPJ403S5njmK+BaTPQmjeKnzLmjPZmRrTP1xPuKGz58nV+BwLWtH7SQMYT1ohf0sysRmdUWkqIx7Ply8g3BpEy67ozDGj0WfCcD03LninwKqju8Fw4170jn9/9lJGXll3HTlqnHEPYo9w58Na7X5ne88swozBzj1C7Sa0NkNaGCeBv8+yXxsE511yzI+0Fp67ytHW8IcZNP72/WYp74/EZvPH4jGwxdGvdg2mblGiaYPsJQ2hYX5MRLxGDZd8s5fSxv2HV0nWlPzec07TNZQzD4JEbn+XhG54FIBQOEE84W86m20kP6nToVMHBvc8j6dnpU9M1dF2jS69qNq6tRRomu+w3inNuPI7KDhEevP4Z3nzyI4x4kp333YGeA7rx5n8+pKEuyshdhnDuTccxaGTfEk8kN3P+9y33/d+TLPrmR6q7duCEXxzIgadNyfneWDTvR+696j989eF3GIaZ2uiprCJMMpYkmTTQNMG4vUZy8Z2n0q13J998Zr7yBX+/7mlWLFpD976dOe3Kw9nziF0261w2rqnhvqufYsYrXyCEYMqh4zjr2qOoqq7YrHy3di7Y9wYWfLEk9TsQCvDMojsJhUJ5Um39CGifjhFcKFOZHEwblHuq5OUfbs+b9h93vMJTf3uLeMz1QndefvaDUQ9oPPjmFTx823TefsY6F6lr1tR+PqVB91MePdh2pFmx8nmyKHQZeBf85VqU5V30BYXlLQavjPkWhfkd8y7kyydnPqXJbarhLc+d3k/JKXSvFTT9EJlKXUp5bAElz33NOiPGTcFRgovwGgGkTW/cdZxL4Xeb6giRu7OUSy5NS5fhlk/TstvZ/b0p9ZErvvu54J4taW/P5fYmD9YASc72LuaZVgjvM6+Z0XRBh06V9OjfhYVzl5HI4w4wUhHmr+9dQ88Bm7+75tezvuc3R95OzOX2L1we4sRfHMRxl0zLir9q6TrOnXwdjXXFDQB07FrFQ7NupLwqcyORD1/+nJvPvj+z3EiIi247iX2P3a1J5xKPJTh79+tYu2Ijhj1jGQjq9B7Unb+881v0zbSJ31q5/PDb+OKDb7PChSZ4efXfWrz89mwqU9GtnxxxeHGmMrMfUKYyWwWxaJyn7387rbRDesTQfiHvPHk4j7x7Jd17V/Pr2060okBqpD0vxU75+2WTK2/3Qiy/fPxeYO7f3u+OOYDvCHUzkav8XMfyxfH7nQspkVIikwYZnd58HQcnGPDtKBdjr+3Ec3c4muL6oVjcI92bU0auTkwunPIcJTzfKH3Kdt0sTWl35HLK8crnzs9r7tLU+sh1fWWZ0WxGJ6mlaG/yOOSd3djMvFtYaQcwDUlDbSMLv8qvtAPE40meuufVZin3kZv+m6E8A8Qa4jx+5/SstQIAz/zldRI+O7Pmon5TA28//VFW+IPXP5NdbmOcB69/tui8vcyY/jk1G+pSSjtAMmGw5sf1zH6nGTY/3ErxU9oBpCmZ/9kPrSxNO0OCMGVRn7ZCKe45yNUkkvyj8etWbsptpmKaVJQHOeqnkwkENN6b/gUzXvsqfby5XhRNyUfYHh28H78RZnca55jhseVtKbsWxx46kSzOJjzpo2g5ClgymT0SX6wMGzelf/uZOpRCvo5TRrYyrfi3htu5tjLXcJTpYssvVWl3yKeEexX2ppZRDO1VYW8jpGlan0L1ke/4FrLiPh5LZqxXyoWRMJj/+eJmKXPxNz/6hpuGZOOamqzw+Z8vJpkovvOdzCHrih/W+MZfv3JjhuJdCovmLaexLnt75XgsyeJvljcpz22dFx96t61FaHOELO7TVigb9yaQz1Smc/cOmHl6Yol4kv/c+xZfzFxIyj7aoSlKpB9NUQDylZ1M5vYeYpiWDbW3zHAIgs044m6aUFOXvaivU0f/+FLCplrrb4dKy44cLIW/rj4tb6QMysKlyekeIfVLV+pIeCnT+o1RZDiE8PNWk5GlJV+heApFISStowdLU2au3wgFkZqWeyAk3322hfSBgiEdEBgFlHdN15rNxr3P4B5sXFPre6xjl6qssEE79GH+Zz+kvZgVQA/oDBrZJyu8e9/OLPdR3jt2qUL32RipGPoN7UlZRZhofabyHgoH6DM4/1o0hT/7Hd80s6Wtinb+/FBv9Tx42875beYZeSsrD3PQSZMIhrP7RIGQTpceHW2lHSCt2AqwlMpCCp9W5CvUL5t8o4uxhP+IomFAY8wy5fBbENnQ6J9vLJ6O1xzU1vt74vDrNEgJdQ3pcCeOaUJtXWb8WKwkOaVzzgANjf6jgsK1gNidzp6VyErjip8xqu5N75iO1DekFPOcZQHE4oVHLXOd45ZGe5e5vcuXA+daaOlrQkqZveg60XSvW5vd07BuxpKSaHpphQohCJeH6T2oW5ZnHC/BcICjz9+/pPxzceoVhxKOZC5ADEdCHHHOvoTKglnxjzpvP4Kh7PBclFWE+clx2crfqb85zLfcky8/pOi8vexx8FgiFWF74bKFHtDo2LWSCfvt2OR8t3aGjh2Q89golz/+bZX2PuKuFPdcVFqbyEjXxx2ej5/+5hCOPW9fwuXph1QwpDPt+N1Ys8bHHZozGuy4wfPavXpNT7zHvDay8aT/sVxpE0lrR9h4IvuY45avsTFtduKYmsRy+6AHoCGaX9ZiP8k8ZjHRmDUK7SjEhgH1DZm20YmkpchHs6dUMSXU1CHd5yYEmDKVZ+pjmlbeTj6NUUuJ9sYTAmmPBqYU8XjC6jTU1kMikRlfSqQ00/VvGFnHSSSgvt51Tq487HZNxTVNS0a77rLLyv/BMEtO0+wfMu+9JsdpLx+vrM0obzGUmkcqXErrWoonMq7zUvIvCu/AgH1NW+Xa4d5lKZpGv+2zR3bB8pDRofNmehWR2WUCKSUxENQJR0IIAZ17dOTCW0/m0LP2RuQYXBFC0LFrFXpAQ9MEo3cfxp2v/IY/vvhr9jhkHIGgjqYJdtxtKPseO9HOWzBkx378/ulL6Te0eTblGjN5BL+5/2f0GtgVIaCiY4TjLz2QU688zDd+nyE9uPnZS9ludP+sY4GgnlFHw8YN5E+v/YbKjuVZcfc6cgIX/vEkuvSsRgio7lrFz647moNO37PJ5xKOhLjz5csZO2VEynPPhP1GcduLv2ryKP62wJ9fv4qe/TMXOgtN8Nj8/I43thl8H9g+nzZCeZXJwdRRV6V/OC7ibJ6eeSUVFYVfClLKlP2i87A/cNjlzkG/BKl0aeXdJ2Nn4VTWpi6W0pcK9YvTFrjLNYwW82Etpcw9rV5ketev9IJR6fnr/Q7+Gy35xXPCimkXvziba0+vaDu8nmPaEYHyIMLUQJMkoy5lOQciIJBGjueTh0hlmJOvPJyDz9oHU5rMfmMu91/1OKuWrAMsH/AgScYNXzNDoQmOu+wgTrvqSIQQxBrjBEI6UsKbj/2PB377H2rW1yE0wc777MjFfz6d7n0tpSTaEOXJu15m+t/fJlofZcLUMZx+9dF07l1N/cYGNqyr5Q+n/5XFXy9HSklVpwqMpEkingAh6Nq7E8f+4mCmnjYl9SwPBAMYSQNNt8x4Vi9bxz9ueJaZ0z8jENTp2K2K1cvWUVYeZreDx7Fq0Vq+/ug7OnSp4thLD+SAU6cAIsvjyRfvzeOh655kyTcr6DmgK6f+35Hsst/oFlVAk4kkekAv+rnpnLdhGCz/YQ3/uP4ZZr89l0hlmMPO3Z8jLzgg67yWzl/B369+gi8/+IaqTpUcddFUpp42paRR/KJkM0zbGZYajyyG7+cs4e9XP8FXM+fTuUdHTrnyCPY9blKrlN2uvcp06Sd3POjSouJ+/I9fqp1Ti6VVFXcf5emVL29scr6nTrmJNcs35I/ktEnKE41PHE34K3FSZo5OO67tnGNtgaOoStl6u0WWgHMPOC+v1D3hbBZkOiPRdr0K4f+iK+aF4aeAu5U5r+tKr8tKv7At8B7e5shlj70Ntd3PbzuZ7n27cP3Jd2OUsNjR4Yjz9+ec35+Q+v3E7S/y0HVPZy3u7NitAw/P+QPlVRGuO+EuPnn9S+L2DtZ6QKNDlyr+/tktBEI6R/f9ue8OqG7CFWGOueRATrnyiKxjDbWNnLXzb9i4elNRNuDh8hBH/Hx/zrj2mIzwz9+dx9VH307MtdN2OBLiF3/9KXsdPbFgvq3NhlWb+Nn431C3qSHVyQtHQux97EQuveenqXirlqzl3F1/S2NdNPVcDZeHOOjMvTnn5hPbRHYFLPp6GZfse0PG2oBweYiTrziMYy45sMXLb8+Ke2WXfnLHacUp7h/9q20Ud9U1zUdTXQbm4cLrDy++3JQ/aZ84fi98vw1d2oNy58hThOcAaRiY9fWYtbWYdXWY8abZaZcmXqYiLjxKs0wkIBq1zFUSCYjHLbOZLOGLkNPPRaZXSff4/PeNkytM0f7I1z7bUNs9ePWT3Hv5v5qktAP8997XU9/j0Tj/+P1zvh5ZatfV8ebjM1jy7fIMpR3ASJo01DTyyqPv8fgfXyyotAPE6mM8ecd0Xz/mb/z7f9RvrC964WasIc4zd7+asRMrwP1XPZ6htIPlKvH+q/7T4s+/pvDfe18n2hDLmJmJNcZ58/EPWbciPTD15J3TiUUzn+Gxhjgv3P9WwV10FS3HP3//X2INnuutIc6/bnm+qHtiq8cZ6Cz0aSOU4p6LPJ4Mpo7+re+hb2f/wMX7/55p3c7hqMEX89ANz5J0LbD6+LU53HnBw8WZRhV8oRepDLTwxZXvpZJ1zG+7e/dhw0A2NGRuMBSLIeMFbOlzlC09/rnNeNzqDDidglgMs6HB+l1bixlNjwpZyruw8vDzJW7bmBcjR0nkU8Z9wiRgxuKYjVHMeHEyOZi2/XtLIk0TMxqz5GuMtkslpFVoRwp6qk2iMcxYjk5oCxCtj7Fy0dompzcNSYOtPK9euj7n48Q0TebO/I7vv1iMHsh+xcUa43w98zvmvD+v6LL1gMbKRdkeUebO/I5oQ2nPp0AowPKFqzLCluRw0bh+5caSfKi3Fl99ON/X93woHOCHuctSv7+e+Z1vRy0UDrDsu5UtKqMiN99+ujDns3jtj+tbWZr2h1qcuqWSS8GQklfm3JAVvPS7lVx++O18O/sHpJTU1zTy3N/e5M5LHgXgs3fncePp97JuWZE3RUEFJ89xP7OK9kABWWTMZ/EoWCPcTVD4ZENDSikx43HLg4x7BiIez9x8J5Gw0qQW1cn8GwA1p8KzOZtVORqMYRTdyZGGYS3abcFNJKSUSGfBraJdYHVoTXcA0l542tIEgjodulQ2PQMBZfaC/049OuaUWQhB/2G96DWou6+tfjAcoP/wXvQf7r+w1Y9E3KBLr05Z4f2H9yYULs1WOxlL0q1354wwv7wBIpVlBEvMvzXoP7x3hicXh2TCoIdr0WPfYb18F+vGY0m69+ucFa5oHXoO7OYbbiRNqrt3aGVp2hnFLkxVins7xFkgasr05kJ5Nkl58s+vEI9l7wr37nOfsGF1DQ9f/4w1FVpZnvL0kVGOX75OmUaRG9J4zGJSOZqmZeLhV45jE+9saGR4PMc4mx0lktaL0kjHcRbRSpeHk3S2Vh4ykUAmk9ZHSmSOqz21INcPIaz0polpGJjJpDV67vKYklltpqXACoGMxTANI+32sRBm2mWjTCbzL6R1bxTj1LnTToZhfTcMq96cuHa4t66cTWdy4Xee0n2NpmSSRSlh0p4Jkj6j7iV7BMktdNb15ldedjKZcwOerGvMLa+PFyD3Zj4leWFxt9XmKrVOPfh1zEqZsXKFF3s+vsd9zidrJ+ACeTbl+jjwzL048deH+ip8ecuy22/nfXdMLTys6BDhJyfukV2lUqLpgnH77sDw8YPpPaRHlqvFQFDnwJ/uw2nXHG3NrBWY/g5Ggkw+fLxvp2PaGXuiF3Dl6CZUFmTiQWOzlKOTrzw8wwsZWDbHx15y4GYtuG8pjjj/gKwOSzAUYMQuQ+g3rFcq7NhLD8pyMRkKBxn/kx3p2nvbUdzjsQQzpn/G9EfeY8n8FW0tDiddbrkEdd9fobIgPzlhEuVVhT3nbe0Is7hPUXkJMVUI8a0QYoEQ4gqf4ycJIebYnxlCiDGF8lSKey5WrYWECQkDkqb93YS1G6ipyd5d7utZC33tLUPhIMt/WM38uT9aGwFpWkoptkxDGpGN0ZSrxdRL0VYYZCyeVn4TCUshlbZ7OR+lRNrmEtKU1ghyLG59TIm0le+0YmOHOWUZhvUCjyesT9LIUH5IJK0wOw6JhOUSMpG0XMa53cUZBjIas+LF7Xh2XF+Xcbl2sdR1q86SSWtEPh63yjUM+/wyyzUTCUtJN4x0XRertNvIZNJKkzTymkylNqVytYf1U6ZcNAIppT3V+bL9sTudkVQnyaXUZymbThqfOs6S33tN+NW3WzaPe0p3Z7JQPnk/fguRk0a6E+f92Neg2x2q93iqfr0dJe8Op16Xqq7wgnJ7r0X3/djUujBNfzeQ3t+edsi8X8309eL6eOslI65POAEdgp59JmS6vZ1zdrr+wbJAVr276xIsUxJd19CDOtuNGYCmi6xyx+41ksGj+rnWVqePabpGVecKRkwYklmWq/0mH5a5BuyCO07lgFOnpEd0HVmE4Ff73cRD1zzJLS9ezvj9RhMI6gSCOgNH9uXml66gW5/OVHet4tT/OzJrBC11ywtBsCzIfidO5tK//BQ/Oveo5taXr2DQDn3Rgzp6QCNSWYYe0AgEdYbvPIguvToRCAUIhoPse/wkfnXfz7Ly+ckJu3PW9cdR2amCYDhApLKMYy89iOMuO9i33Lam37BeXP/0L1Ido0AowKRDd+aaxy/OiLfdmAH8378upHu/Lqk62POYXbniofPaSPLWZ9E3yzll9OXc+vOH+Ntvn+CCfW7gjxc8lHc/mJZm1O7D6TesZ+q+xzQRSI668IA2k6k90VyKuxBCB+4BpgEjgROEECM90X4A9pRSjgauB+4rmG+poybtgVbxKmO7bXSPdjh19cr8WzLiGkmDw4f9kkRNQ1Y+elDnkdk3cfLE6zLzk9Lfw4pbqcqHn72zYd2EXplbasQmpVC6w2IxS6HVPS7G3C/8XOm928qnFufmlj/1cjcMqzxd9/e2YxS3IE5CSiFPjcb5zVQEg0XVa6YiVAIyxwitcziZZwYmoBfeWTWfd59gIO+5FXtNyWQeU5wCZZRa1ubgtFFzlCOlzL1xkCYQgZbZrPr6py/lHzf+l+8+X1TcjIuU1sWeTCI0QbgiTCyWeY8EywL8/A8ns8/xkzhu4AVZu1M69BrcnYfm3Eq0PoZpSu77zb955eHsbdO1gEakooz6TZnPyXB5iN88/HMmTN2JlYvWcOboX/mWEwjq/P2LP9BzQOY0f0NdlJO3u4j6TZkLPsvKw1z39KXstNcORBtiJONJKqvTbnxrN9Rz0pCLshaFBsuC3PbGb+k1sDtlleGiTWHqNtYTCAUoKw9nfJdSUru+vqi8DMOkbkM9ldXlW4QfcikltRvqCUdCWZsrZcVbX09ZRYhQWe54WxtSSs4YfxUrF2eu7SgrD3HRbaewzzG7tolcz97zKg9d+2TGAlVNEwzZaSB3v39di5ffrr3KdOonx+x7ceGIwIynf5X3PIQQuwHXSikPsH//BkBK+fsc8TsBX0kp89rxqRH3PHhf5M7vacMzZzvmfb4EPYdf9859unD5CXdn55dLkWuqrbOUtnt3f5lbDG/+fkq7Xzy/cE3LdKlYRF0IJ46U1qZHucoowlWje5Q8w7OMI5dTVgnKV5Prv1C6XOYGQhRW2k0zPdLik28hmYs+Jz2H4pHLnebmlLUZNGcZIt81m6s+moHZb85l4ZeLizbrES5vVcFQAOmz2D0RTfL6v//H7De/QsuzY/P6lRv5ccFKIpVlVHSI8M6TM33jmUmTZDy7UxNvjPPBc7PQdY3Hb30hZznJhMH7z3ycFT7vo+98L+VoQ4xXHrI6EGXl4QylHWDmS7N9dzs1kwYznv+UDl0qS7Jfr6yuoKw8nPVdCFF0Xrqu2Zs0tX+lHexz61yZV2lPxetSuU0p7QCLv1nOxjXZM/TRhjgv+XRuW4uX/v52llcZ05QsmruMdSs2to1Q7YgSFqd2FUJ84vqc7cmqD7DU9XuZHZaLnwIvF5JPKe7NQCKeRA8FoGMHaxoarJd3pIz+owZRWx+1XpR5bOSbTMoMILedsvUxs44VzrpAPPfsgP29mBHFLHMNN5qWUv5LwjEbyHXcUbxzJYfsEX9HRkd5b4JcJc1ouU0DCiCEsMwdMjo+In395SrCWe9g/XKVJy2lvRmVS+F0ckqUsd1TqI0CunWeDkJYdZuVTel24rlorI+W3OEXQP+RfTj/rjPQcrRJPBonHkv4nq4jvxAiw8OIn8mgO012GKlR73g0/+Jq7zoigETMf60LQLQxhpFDnkQs4bvhk2nIgnJsrRiG/9oSRdNIxJI5B1L8ruXWIpFjxlVoIuexbQpZ5AfWSinHuz5eMxdfZ95+RQoh9sZS3C8vJF6LK+4tYZjfWngfYM7vl7+9OSN8+7EDiEfjlj/wykpEdUdEdUciXaqZO/sbalfWWYscJZmLXf0LzVAKcj5EpZOPtPUvr5KefYVJaWbYBOfKO2Xn68TzW0zpXsTqtit279zqzRPbfMJZ8Jo0rI/X3AZyj7b7tYkE9AA5XWQ6dYUAoWV9pNAy8zalZXZkynR7ucst8sUmpcx5jr4yOteH3/bvPgghEMEAIhS0PoEC5ie+JkP29VFCp6EUhCYQAd36a3cMCsrYUuQ5v6JUXpdZFo6bUJ/8hLBMYqw20a1L2UnnrBlxL/p21jpkFVf8dfbeUx+SaCxN2ZRSsvTbFdxxzn00bqiz1rW4ro9wJMQ+x01i3N47YLj2YEjJb1/b0jDpOzy9IHGnvb0mnC582r6sIsxex1ibDB1+/v45k+oBnd0OGpcRtvTb5Txx6/M0bKzPeFZJKdE0wazpn3Fg+cmcP/Eqvpm1ICPtLgfshOnjfz1UFmSPw3bJfQ5bId/MWsD5E6/iwPKTObTTGfzlF49ss52X5mTwjn0JhrI7xeFIqM3MZAD2OnoiwXD2IFvnHh0zvAJtiwhKGnEvxDKgn+t3X2B5VplCjAYeAA6TUq4rlGmLKu4tZZjfKjhuAL02yskkhkf5ef2pWdmNKCXlFYLo+nh290pKLCXSxxYbMhasARl/nWPOCLt71Cu9kVA+H++u4mzl3fRbCOnFvUjVfdxn06eMBZQu+S3PNv4jbk6eGefqUSa99uIp22T3+Usy0/mMxHklEM7/eiCVf1YNmi55TJlzkWOG7Blu99JyO2Vk2b+7j3uUd9+4nnIzK5SMuvMtw4ujXHrqLysfv3z9yssVN1ecUmTNd55+6XJ1vFydT+8skLezCmR3fLyzaF5ZvJ1Sw0gtRE/nIdPehzzl+V1jWddZ0qB+Q4OVR9Z9Z5eT9aiRKaU7A8O6x8sqwgwY2YeDz9qHDl2qOO/WkwmVBa1F7540RjzJg1c+nvr9q/vOyfKQAnDWDcdx8Z9OJ1QWTJmClFWEGbvXSCYdsjMA2++yHeP3H52VFuCQc/Zl8Kj+qd8162q5eMo1zJ0xPzOiaaIJMA2DRDyJlPDd7B/49f438uOCtO/wyupytIDIuo/0gMaIXYf4yrA18uOClfx6/xv5bvYPSGltxDP9729x0yl3t7VoWzx6QOfyv51FOBIiGLLeL2UVYQZu34eDTtuzzeQ69hcH02tQd8oqLHOuUFmQSGUZVzx0Xrv0YtSq5Hr/5Xpf5WcWMFQIMUgIEQKOB553RxBC9AeeAU6RUs73ySOLllkplWYCsEBKuRBACPE4cBjwtRNBSjnDFX8mVo+k7RECYZop+2mwFEQpBLrLnEBKyT///DoJH9vNdSusneGybgMnT/dCVSc8aaSLdMxbhEgrDrZMEoFMJHxHWYU7vl/ZSOt9bhgYNTVWnrqOVlaGCAbxWxCYUpJz5pk+DwFpjxZOeJ7FocKJKKVVx4mEpURrrk6IlAhHbvsUUr8zBbU6UcKdzqe8rFOw60zLY8ZhpjtJlvJupG3npTWiL5369VuUaUq7m241cOoy8DuPjPhOHXkURNNEaJp/x9BPmS/Wi4Fz3Xt/u13n+c2IOPlrrhkMb5mGkZkXpPMx09d7xj0ihG/1eO/PrO/u69JdJ37HAOH2RCSEdS06cdzyuXHOUdezOw++8X1OxAk3TJcLVzu9JtIymfasnRBITVjfvWUkkqBpSIGtkIIeCnDAaXvSb0Rv7r/iMcwCM0CVVWVc+refMengcSkF+8Az92bHScO46pA/sGpx5kZEiViCF/72OqdeezSRijI6dK7kicV38+gNzzLr1S/o3KuaM647lhE7DwZgxC5DeOPf/6NuYz27HTSOsfvskHLzCHDjs5fx7tMf8c+bnmXjmhoG7tCP0685ih0mDsso99VH3iUezd50TAtoCESWyU4iluCpO1/i4rstDzHvPPFh2n2qfT1I08RIJPnsza8Yv/+YnHW0NfHUnS9lbfIUb0zwyatfsGrxGnoM8Pf5rSiOnffegQdm/o7XH5/B2hUbGbfXSHabOqZN1zFUdIjwlw9v4IPnZjHng2/oObAb+580mU49OraZTO2JYl09FkJKmRRCXAC8CujAg1LKuUKIc+3j9wJXA12Av9h6V7LQwt2WVtz9DPPzzQ/lNMy3jf7PBujfv79flJbBRwGett2veHnBrYC1MUftxmxvMmYshmxohEAADaypZU0gDdMaGQ6HLNs3rxIB+I3Opr9abvZkwnLHKMrKrHw0LeUCUQTzL4KyTF1MZF1dOm/DwKyvh2AQrbw8I27KDSEgAgE0T8cFw0hN96eOGyZmLIoIhdKdgDw9VCklMhZPK1G6REiBlNZCSmnKdEfGUWSkBKGl6jHDm45LMRGulzLStE1kshdICltB9BtxsGYiDFuJdC3gzBglNVMdgJyjFjL1n93OHiXZJ76UZk7zI8deXWr+i0rdsw9O7ecqTfgosxmzF/a16vZ9nZW/S/nOaRYjZYZ/9Kx4nrwlpJVoRHphpVtRd9L5ffcpP9fxlIkYpDsgpulr+5+SzzQtN6X2uTh9y1Q9FDuCZY+Cu9E1kWGmkopnZMuf7lS6Zw8kAS3AmMkjGLbzYB75v/8QLWDDmoglmXx4tqlI/xF9ctqv6wGd9cs30GeoZTJTVl7G2TedwNk3nZAVt+/QXpx+zdF5ZdjzqF3Z86hd2bS2hg9f+JQlc5fSa2A3OvfslIqzcM4S4j7mQbptnuStNyNpsnDOEjaureGfv3uKT1+fQ2NdNH09u+Itnb9im1Hcf/hyCYaPyVAwHGT596uU4t4MdOvTmRN/2b5cewZDAfY+djf2Pna3thal3dGcu6JKKacD0z1h97q+nwWcVUqeLa24N8Uwfw+/47bR/31guYNsLgGbgqO0AwRDOtWdK9mwthawXp7mqjVp3+FCYDovd0cZsl8UomMHdJeSXGgnLmmamDW1mcpiQ0N2MiHQOlTlVDZkIoGsz+5sABkj49I0MWtrMzsOmoZZWYmmada51tdn7C4q43GMQMBSpr2j7F5FK1Mwj2tIiSmchZSeNBmjhSbSsPMOZnYSZCKOCAQxhbDti42UHCKYPZWfoSj6KcHOeXrLwukM2Z0Xn7zzkU/RT9nwe00dTDMtD1idJy3Thtxp66w8vUp+jvUEUkqrDG+b2a4wc+VvJ7Zk95kRks794FaQc52/fY5uCaTQEE0crcpb1z516ixM9l1Y6le3bnnF5rl/DIYDvgpVPqSRtDqmZvrei9Y28Pw9L3PDi7/JPRPnos/QnjmPDRrVj7U/rsu6JEzTpEuf5t1Q581/v8/tZ/01tWHT3Rf+nfPuPIODz94PgGHjB/PBcx9necfQEL4LUgNBnXAkyDHdM32ySyFAS983jr/3bYVhOw9m/icLSSYyn9fxaIJ+w3u3kVQKRRshye3GuJ3Q0otTW8QwvzUwN2zMWjAmTRO5cVPGy08IwWm/nEo4Yo1yy7r6lNLuKChe29mUAr+pJr0YzGVO4timel+yZn1DceYOUmLW1bvy8hyORvOcuJnaIMesr89W2kzT8tUO1t9ktokQyaS1UZTz3a34+4prKb0ZYcmEv9KeC0fJ9OQnjaQ1qu1SZJxOgp8Ns+MBIOuYJ71MJrLSpnaUzbEbaTHn7Z9GZskj/erd3TnMFceOJx1POZo1Y+G3X0HWRkTOcaeec+WfzgivDX6GyZcTZmTv2intUXn/fM2sfDeXnPXlc60AuWXzpsXT9jnXT2efj6Zp7Hn0rln24sFwIGs3ytQ16r1Wbb77dCHT73+Doy89iLDtptAPTdc45w8n5zx+6tVHE4pk7/B51CUHptwfNgfrV27g9rPuJR5NEK2PEa2PEY8m+OslD7Fi4SoA9jt5MmXl4QxXlcFwgO3GDWTKUbtmuSgMhoN8/sac7MJcz+dgKECvwd0Zs1eeBbZbGUdedCBBz/UUjoSYfMQEujZzZ0yh2CKQRX7aiJZW3FvEML81kDW1mGvXp3eVTCQw163H3FTDAaHM6d8DjpnARTccTc++nZG16ZF3IGsa1ovZGE15aTATCWuUu6EBY1NNSumV0lpASq7RTT8MA9O7U2oiaY3Y53HXBiDr6zGj0dx26bGYVS9F7EgqE5ZZjyklZjKJNJKZi2FN01KCfTskJd4ZpoGZiCPjsXR+Uvp2LmQykbmYz5bDTCaRiXiGciiNZLZSZ5qp88A00x0VWw6ZTCCdPJzOkN95GwYyEffdldPJVyYSmYth83TeUl41cu1E62Dv3IqnzIyFjXk8H5mF8neV4+SXOifvdex0dtznaOS3w/buIpshv5Sp3TSlaWImk5iGYbVXrh1Q85UlJZXVFVR2qkhPDBS5XsDbdn4IAdgdTLc8/Yb14NcPn89xvzqUjl2rCAR1Ru0xgrve+x0X/vkMT73mb49YY5zpD7zJqVcfzU9vOI4uvTqh6VqGZ4mOXau47plfMnbvHXLmM2znwdz04hUM23kQgaBO517VnHn98Zx2zTFF1UexfPDMx76TMKZh8u6THwKWr/S7P7yBXQ8aRzAcpLxDhGln7s1NL13BZQ+cw9G/OIgOXSoJhAKM2XMkh/18v9ydPWkSqSzjJydP5rY3r86wud/a6TmwG3e+cy1j9hxJIBSgqnMlR//iIC77+zltLZpC0SY0o1eZFqFFTWVayjC/1WhsxGxsLBwP2Oewcexz2DhOHXphakSoGL/KsrYWw1b2vZi1dUWLmitvaGLHsIBSbtbXF59XMpmlPLfYNV/sAkzs0fisEW97UW0xnaSEj8cglxwZyjwgfUZCrQOWWU9+WY3idn/NZ77iF7fQqHkuityJFoqsy6bIYhj+I9+a4IXaf3HltJv44u2vsosq4Rpx+NUD57DbIeN54d5X+eulD1NKDn5tFwgFeGzpvaxespbL9rmWxoTTeU3nrGkauq5x8lVHcvJVR2akL+9QRigkiDX41K29PtpLMp5ECMHhF0zl8AumlnAGmYzaYwR3f3hjk9MXQzKe9PexbsoMP9M9BnTjuqd/6ZvHadcck9GhePK2533jAXToXMHTax7cDIm3bAaN6s+tr/+2rcVQKNoHzTib2xK0+LCClHK6lHKYlHKIlPJGO+xexzhfSnmWlLKTlHIn+9M+lHayzRuc36/GH8uZZsXCVempV2c0bFt3r6RQtCJj99mRNx55l28++q55MhSwy7SxLP9+Jff+4pGMzYaaSt9hvanu1pEhOw0k6LOjZrg8zL4nT86ZvtfgHlR365gVHgwHqOpU6RMeZJ8TfJcPtUsmHrKz72MzGA4w6dCm+Vif9tN9ch6bfNTEJuWpUCi2MqTlVaaYT1ux7cwHloptLyztUb2U6YFpsr9+bO50PrbsCoWidSivinDJvefw0v1vEGvIPWsUjoToPzLfztNpzr3jdAIBnXeemJF3V1Bv/oBlg61rKbvycCREeYcIlz96AQC6rnPVvy8hXB5Oma1EKsvYbqeBHGQvwvRDCMGV/76YSGVZyt49UllGvxF9uPbpyyiviqRs0csqy+i9XU+Ou/zwomRvD/Qe0pMTrzyScCSEpgmEJgiXhzn051MZMmZgKt7bj3/A1NDx7Kcdw37aMRzZ9Qw2rt3om2dldSUnXHFEVniHLlX8/M4zWuhMFArFloTA8mJWzKetaGmvMls23oYp0FBHdDs9O9DrA1uhUDQfAjRNUFFdweEXHchRFx9ERYdykgn/UXFN1/jJKVM44sID2W7sID588VP+c/OzxKNxpv50X0ZN2Z47z/4by+Yvp+fgHlx637lsZyuKRsLwNd/IEkkTnHPbaSyau4ShYwcz6YgJfPLyZ8z98Ft6D+nJfqfsSYcuVan4434ymofn/4nXH32Hdcs3MG7f0ex68LiM/SL8GLnbcB5ZcDevP/oOqxevYdSUHdj98F0IBAM8suDPvP7ou6xctJpRe2zP7kdMIBjK7ya2vXHSb49m4iHjeeuxD5CmyZ7HTGL4Ltuljn8zawE3nXhXRpra9XUc2/NsXks+4ZvnmTedyK4HjePhq/9Dzfpaphw1keOuOJzAZnj/USgUWxltOJpeDKI5PTO0FuPHj5effPJJi5axn5Z7sdXr5pMlp1EoFE1DaILyqggNNQ0Zfd9AUGe/0/biF/edm5XmiT8+z6PX/IeYx893516deGzpvWiahmmavPOfGbzy0FtIQ7L/aXuxz0l75FSYv/9iERfvflWW+0E3miaYcNDOXP/fy5t2soqiOa7Pz1i/YqPvsVOuOZZTm3nBrEKhaB6EEJ+2J7NoNx069JW7jD+/qLhvvX1lm5yHMpVpAn4K+i/3v6YNJFEotm40XaNjlyr+78lfUlFdkTI5iVSW0bVvF35604m+6Q47/wAGjepPpLIMsLb0LqsIc9Vjl6Q8hvz+pLu44+x7+eyNL/n87a/40/n3c+2Rf8zpeWTImIEcdv5UwuUhhCZSbgj1oKXol1WE6ditAxfe/VPf9IrmZcOqTTmPvf/0h60oiUKh2Goo1hXk1upVZmvlpei/ssLmvPF1G0iiULR/+o/sy9GXHsyy+cuRwKKvljLr5c+y4mm6IBAMEI8l0AM6240dxIE/3Ze9T9idSGWEf3x/D2/+6z2WzV/BsPFD2POY3QiV+W92FY6EufODG5j54qd8/vZXdO3bhf1OmZLaefPbT77nwxc+zbCDj9bH+OyNOVx92C0snLOYDl0qOeaXh7L3CXuk/Nz/7JZTmHLMJN57cgaarrHboeNZ9NUyFs5ZxODRA9n7+ElEKiPNX4ntCCklb/zzPZ6+/UVqN9Sxy9SxnHz10XTt3bo+vyMVYRpq/fekGOyyg1coFIrikYh2vgGTUtybwEFlJ2WYyxzbt6TdahWKrQqhCWSeB12HzpVMPmoildUVACz/fiVnj/5llhmLaUjihuXqz0gYLPpqCQhSinBldQWHnT+taLn0gM7uh09g98MnZB37/K2vSMaz7eBjjXE+eulTpITVS9Zyxzl/Y9HcpZx5Y3pkf/j4IQwfPyT1e+TE4UXLtDXwwBX/5Pm/vEq03ur0vPLgW/zv2Y+4/6vbfT3dtBTn3XUmt535F99jv3ro560mh0Kh2Mpo5ybkylSmCbySeDz1/av/zWPD8txTtgrF1ooW0AiVBdED+RdRzvvoO47r/TP+dMEDJJMGz/15epbS7kesIc79v/5nzoWmm0OHLpUZmw+5cT+zo/Uxnr7DGllWwKa1NTz355dTSjuAkTSor2nkubtfaVVZpp6+N/ufvldGmBCCG6f/Ri02VSgUTWMLcAepnm5NYGr343l9nTXifvn+17exNApFy9KhSxUPfnMnobIQ0fooICjvEKGhppHn//IK//zdU3nTGwkDI2Hw2sNvs2rRar54p3izskQ8ydof19NzYPfNPItMphw9kb/+4uGi4mq6xg9fLmH0lJHNKsOWyPdfLCYYDhKPZm78lIgl+PytL+G641pVnl89eD6/evB8Zr81h849qhm4Q/9WLV+hUGyFqBH3rY9X1/wn9T3eWOQulQpFCxAMB+g1pAdCK32Tr2BZMGc6IQSRyjK69e3CH9+6ho5dOhCpKKNT92o6de9IuCxEp+4d6dG/G2UV4aLKizXEmfXK53n9q3sxTTPDdWJzUdGxgpumX0XHrlVEqsrynkO8MU7XPq1rv91e6da3s+8MiKYJeg3u0QYSWYzbZ7RS2hUKRfPQzhenKsW9CRx0kDWq9OBvsxepKhStRY+B3bjrfzfyyPw/U9mpoqS0QkDHLlUcc9khqY16HMKREEf/8mBufeta/rnoLwwaNSBnPlOO2Y1AqPiJu1y28JomsuQIRULsfdzulFe1zGLPHXcfwX9W3M/Nr/yWs289lXAO5T1cHqb3kJ4tIsOWRr/hfdhup0EEgpnmUcGyIEddenAbSaVQKBTNR3vfgEkp7k1gwgRryvyxm55rW0EU2ywDd+zHnz+8iaHjBiOEYNcDx1lbvuVAD+kgQA9oBMNBho0fwu3v/Y4zbziRA8/al1BZiEilNfJ8wpVH8rNbTmH4+CEp14m5KK+KcPs719F/+76EyoIEy4IM3KEf/Uf29Y0fqSrzDe8+oBtn33oK5R0ilFWECYaD7HnMblz8158VXSdNQdd1Ru42nH1O3AN8OhVCExz4s31bVIYtjd89fzlj9xlFMBwgXB6muntHrvz3JWy306C2Fk2hUCg2DwkYsrhPG6Fs3JtATU0NRtJoazEUWzmBUAAjaWSNUvcZ2pN7Z9+asSj01GuP5b2nZhL3WfSpBzSOvOhgTrnmaGrW1hIIBejSq1Pq+Pl3ncmZN57A+pUb6da3S04Xi7kYNGoAf597B2uWrUMI6NqnC3NnfMvl+19PPBpHmhIhBKFIkJ/feQb3XPwQ8cY4pmEiBITKQlx491lMmDaWA8/alzVL19GxaxUVHUubRdgcKjqUc8o1x/DP3z1F1Dbl0YM6HTpXcvwVR7SaHFsCHTpXcdPLV1Gzrpb6TQ10H9C14C6vCoVCsSUgaNvR9GJQinsTEELw4v2vt7UYii2MYDhAeYdyNq2pKRg3VBbkJydP4ZDzDuC2s/7K4q+XEgwH2f/0vTjr9ydleXLpNagHR196MI/d/KyPOYqgsrqcSEUZkQr/Ee9IZYQ+222eSUq3vl1S33eYNJw/zbiRf93wFAvnLGbQ6AGceOWRbLfTIEbuNpx/3/g03876nn4jenPCb45k+12HAhAMBdvMLOW4Xx9O/+378tRtL7Bh9SYmTBvLcb8+rFVdHG5JdOhS1SLrDxQKhaJNaeeKu8i1S2B7Zvz48fKTTz5p0TL8dkd1OPs/x3LfcU+0aPmKLY9ASGfQ6P5898kPvsf3Om4SVz12aeq3aZrcfdGDvPLgW0hTkown0QMamq6xy9SxXPnviwlHilv4CfDjghWcPfqXWR4/QpEQ93x8MwN36Ne0E1MoFAqFopkQQnwqpRzf1nL40bGit5w4ojgTzddm/67geQghpgJ3ATrwgJTyZs/xEcBDwDjgKinlHwuVq0bcm0BDQ0Nbi6BoZ/Qd1ot7Zt1CeVWER697gn9c92TG8Yrqci69/9yMME3TuOjuszj1mmNY+s1yIlVlNNQ00nNQd7r361qyDH2268XJVx/Dv65/ioS9uVAwFODoyw5RSrtCoVAoFIWQQDP5aBdC6MA9wH7AMmCWEOJ5KaXbJ/J64CLg8GLzVYp7E3jx4VfbWgRFM1Jo5093vMpOFSRiSYx4kkQ8SSCoEwgHueIfF6W8n5x6zbFMPmoiD/7232xYsZHdDhnPcVccnnNTmOpuHZvNHOOEK45gt0PG8+6TM5CGZMoxuzF4dG6vMAqFQqFQKNI0o437BGCBlHIhgBDiceAwIKW4SylXA6uFEAcVm6lS3JvAxneV7/atiUhlGXpAp6G2ESNhLzoWlscUBFRUReg+oBs/OXlP9j9tT2rW1/Hcn6bzzccLGDSqP0dechC9BmX6sB60Y3+uf+6KNjgbGLhDPwbu0Lob4SgUCoVCseUjwSx6yL2rEMJtt32flPI+1+8+wFLX72XArpspoFLcFVs3QhMMGTOQRV8tIZnw9wTUf/u+XPP0ZTxz54t88c7X9Bnai2MvO5Ttxvq7t+vauzNn3XxyS4qtUCgUCoWitZGUsjh1bQEbdz8nzZs9nK8Ud8VWixbQOOrSgzn7llN4/+mZ3HLan4k1ZLpLFEIw7cx96Nq7M2f/4dQ2klShUCgUCkW7oJls3LFG2N0LzPoCyzc3U7UBk2KrRA/q7HbIeM64/ngAJh6yMx27dkBo6Q6w0ASdenbkJ6dMaSsxFQqFQqFQtCOacefUWcBQIcQgIUQIOB54fnPlUyPuiq2KcHmIfU6czHG/Pow+2/VKhQdDQe6acSN3nXsfs175DClh5/3GcMnfzi55wyGFQqFQKBRbKc20OFVKmRRCXAC8iuUO8kEp5VwhxLn28XuFED2BT4AOgCmEuAQYKaXMueGLUtwV7YIOXauor2mwFoc28Z4JlQW597M/0ndoL9/jXXt35vrnr8AwLFt3tdujQqFQKBSKFFKC0Xy2MlLK6cB0T9i9ru8rsUxoikYp7ooWZ8fJI9hh0ghmvvAJtRvq2WXqTkw7a18+e+NLuvTuxP6n74Wu6/zw5WJWL13HioUr+dtl/0ATAi2gYRomh5y3P6898i5GwsA0TaL1MWvZh63kh8tDTDp0l5xKuxulsCsUCoVCofClnW9MqnZOzUG+nVO3NfSARr8Rfdi4ahORqggdulSycM5iErEkekBHD2hUdCxnxK5D6TmoO/977mM2rNpI9/5d+eUDP2fUHtuXXGa0IcasVz4nWh9l/P5j6NSjmkQ8waxXPqduQz2DRvVn+v1vMOO/syirLOPQ8/bn8IsOVEq5QqFQKBTtmHa9c2pZTzmp7ylFxX3l+z+2yXkoxT0H27riruka0366DydeeSTd+3dra3EUCoVCoVBsBbRrxT3cU07qU5y751d+uK1NzkOZymzDhMvD7H/6Xpx01ZFE62N079+Vdcs3EI6E6NSjuq3FUygUCoVCoWhFJMjms3FvCZTinoO/zfkj54y+rK3FaBJ6SGfHySNYv3wDmtAIhgN07NaB3tv1Yuw+O7LL1LGUlYd90/Yc2L2VpVUoFAqFQqFoJ7RzSxSluOdg8I4DeN18ktvP/isfT/+MdSs3NKdT/manolM5599xOvuevCeaptzzKxQKhUKhUJSEpFm9AM1HcQAAC2RJREFUyrQESnEvwC/uOw8pJdcc8Qc+e/NLy5tJG9CxaxWRqgiN9VGGjR/CIefuT5fenenSuxNdenZqE5kUCoVCoVAotirUiPuWjxCCa56+jNcffY8n/vgcS+dt9o61ebn43rPZ9aCxSBO69OqEHlCeUhQKhUKhUChaFqkU9y0ZP88yr5tPAvD24x9w04l35Ux74m+PpH5TIxtWbWT05JHcffHfC5radOnTiVte/T8GjOy3WXIrFAqFQqFQKEpEAuY2biojhJgK3IW13esDUsqbPceFffxAoAE4XUo5u6XlKkQud5D7acfwuvkkex+/B7Ne/ZzXH3nXN95p1x6XYWt+yHn78+GLn/Lo1f+hZn0tR158MMf88pAWkV2hUCgUCoVC0QS25RF3IYQO3APsBywDZgkhnpdSfu2KNg0Yan92Bf5q/233/OrB8/n+88Us/GJRKkwIwR/evCZrgaimaex+6C7sfugurSylQqFQKBQKhaIotmXFHZgALJBSLgQQQjwOHAa4FffDgEeltRPUTCFEtRCil5RyRQvL1mScUXchBH/77FY2ravhjX+8x6BR/Ri375i2Fk+hUCgUCoVCUSpSIg2jraXIS0sr7n2Apa7fy8geTfeL0wfIUNyFEGcDZwP079+/2QXdHDp26cBRlxzc1mIoFAqFQqFQKDYHs32PuLe0w2/hE+atkWLiIKW8T0o5Xko5vlu3bs0iXFNxFqgqFAqFQqFQKLYipCzu00a09Ij7MsDtIqUv4PWlWEwchUKhUCgUCoWi5ZCy3XuVaekR91nAUCHEICFECDgeeN4T53ngVGExEdjUHuzbc42qq9F2hUKhUCgUiq2UbXnEXUqZFEJcALyK5Q7yQSnlXCHEufbxe4HpWK4gF2C5gzyjJWUqBaWkKxQKhUKhUGwrqMWpSCmnYynn7rB7Xd8lcH5Ly6FQKBQKhUKhUORE0u4Xp6qdUxUKhUKhUCgUCgDZvm3cleKuUCgUCoVCodjmkYBUI+4KhUKhUCgUCkU7R0o14q5QKBQKhUKhUGwJtPcRdyHb0KVNUxFCrAEWt3KxXYG1rVymonlRbbh1oNpxy0e14daBasetg9ZuxwFSyrbdSTMHQohXsOqjGNZKKae2pDx+bJGKe1sghPhESjm+reVQNB3VhlsHqh23fFQbbh2odtw6UO24ZdHSGzApFAqFQqFQKBSKZkAp7gqFQqFQKBQKxRaAUtyL5762FkCx2ag23DpQ7bjlo9pw60C149aBasctCGXjrlAoFAqFQqFQbAGoEXeFQqFQKBQKhWILQCnuCoVCoVAoFArFFoBS3F0IIaYKIb4VQiwQQlzhc1wIIf5kH58jhBjXFnIq8lNEO55kt98cIcQMIcSYtpBTkZtCbeiKt4sQwhBCHN2a8imKo5h2FELsJYT4XAgxVwjxbmvLqChMEc/UjkKIF4QQX9jteEZbyKnIjRDiQSHEaiHEVzmOK/1mC0Ep7jZCCB24B5gGjAROEEKM9ESbBgy1P2cDf21VIRUFKbIdfwD2lFKOBq5HLcxpVxTZhk68W4BXW1dCRTEU045CiGrgL8ChUsodgGNaW05Ffoq8H88HvpZSjgH2Am4TQoRaVVBFIR4G8m0WpPSbLQSluKeZACyQUi6UUsaBx4HDPHEOAx6VFjOBaiFEr9YWVJGXgu0opZwhpdxg/5wJ9G1lGRX5KeZeBLgQeBpY3ZrCKYqmmHY8EXhGSrkEQEqp2rL9UUw7SqBKCCGASmA9kGxdMRX5kFK+h9UuuVD6zRaCUtzT9AGWun4vs8NKjaNoW0pto58CL7eoRIpSKdiGQog+wBHAva0ol6I0irkXhwGdhBDvCCE+FUKc2mrSKYqlmHa8G9geWA58CVwspTRbRzxFM6H0my2EQFsL0I4QPmFeX5nFxFG0LUW3kRBibyzFfY8WlUhRKsW04Z3A5VJKwxrkU7RDimnHALAzsC8QAT4UQsyUUs5vaeEURVNMOx4AfA7sAwwBXhdCvC+lrGlh2RTNh9JvthCU4p5mGdDP9bsv1uhBqXEUbUtRbSSEGA08AEyTUq5rJdkUxVFMG44HHreV9q7AgUKIpJTyuVaRUFEMxT5T10op64F6IcR7wBhAKe7th2La8QzgZmltDLNACPEDMAL4uHVEVDQDSr/ZQlCmMmlmAUOFEIPsRTXHA8974jwPnGqvvp4IbJJSrmhtQRV5KdiOQoj+wDPAKWpkr11SsA2llIOklAOllAOBp4CfK6W93VHMM/W/wGQhREAIUQ7sCsxrZTkV+SmmHZdgzZoghOgBDAcWtqqUis1F6TdbCGrE3UZKmRRCXIDloUIHHpRSzhVCnGsfvxeYDhwILAAasEYZFO2IItvxaqAL8Bd7xDYppRzfVjIrMimyDRXtnGLaUUo5TwjxCjAHMIEHpJS+7uoUbUOR9+P1wMNCiC+xTC4ul1KubTOhFVkIIR7D8vjTVQixDLgGCILSb7Y0hDWzpVAoFAqFQqFQKNozylRGoVAoFAqFQqHYAlCKu0KhUCgUCoVCsQWgFHeFQqFQKBQKhWILQCnuCoVCoVAoFArFFoBS3BUKhUKhUCgUii0ApbgrFAqFQqFQKBRbAEpxVygU2wRCiGohxM9dv28VQsy1/54rhDjVJ81AIcRXrt+PCSHmCCEubS257XLrWjDvvYQQkwrEyagHhUKhULQNagMmhUKxrVAN/Bz4i/37HKCblDJWTGIhRE9gkpRyQMuIlyonIKVMtmQZHvYC6oAZrVimQqFQKJqAGnFXKBTbCjcDQ4QQnwshXgcqgI+EEMcJIa4VQlwGIITYWQjxhRDiQ+B8V/rXgO52+snezIUQ3YUQn9rfxwghpBCiv/37eyFEuRBigBDiTXvU/k3X8YeFELcLId4GbrG3l/9QCDFLCHF9vpOyR8zfFUI8IYSYL4S4WQhxkhDiYyHEl0KIIXa8Q4QQHwkhPhNCvCGE6CGEGAicC1zqnJcd/qxdB1+4RuN1IcT99izFa0KISJNbQqFQKBRNQinuCoViW+EK4Hsp5U5Syv2ARvv7fzzxHgIuklLu5gk/1JX+fW/mUsrVQJkQogMwGfgEmCyEGACsllI2AHcDj0opRwP/Av7kymIY8BMp5S+Bu4C/Sil3AVYWcW5jgIuBUcApwDAp5QTgAeBCO84HwEQp5VjgceDXUspFwL3AHa7z+hPwrpRyDDAOmGunHwrcI6XcAdgIHFWEXAqFQqFoRpTirlAoFDZCiI5AtZTyXTvoHyVmMQPYHZgC3GT/nQw4iv5uwL9dee/hSvuklNKwv+8OPFaCDLOklCtss5/vsWYHAL4EBtrf+wKvCiG+BH4F7JAjr32AvwJIKQ0p5SY7/Acp5ef2909d+SoUCoWilVCKu0KhUKQRgNyM9O9jKeoDgP9ijYTvAbyXI767rPo8xwrhttM3Xb9N0muZ/gzcLaUchWXfX1ZC/t4yDNQaKYVCoWh1lOKuUCi2FWqBqnwRpJQbgU1CCGck/KQSy3gPOBn4TkppAuuBA4H/2cdnAMe78v4gRz7/88RrDjoCP9rfT3OFe+vlTeA8ACGEbpv+KBQKhaIdoBR3hUKxTSClXAf8TwjxlRDi1jxRzwDusRenNpZYxiL7qzPC/gGwUUq5wf59EXCGEGIOli36xTmyuhg4XwgxC0vhbg6uBZ4UQrwPrHWFvwAc4Vp0ezGwt21S8ym5TWoUCoVC0coIKTdnVlihUCgUCoVCoVC0BmrEXaFQKBQKhUKh2AJQi4sUCoWiRIQQ92B5fnFzl5TyoRYscxTZHmZiUspdW6pMhUKhULQvlKmMQqFQKBQKhUKxBaBMZRQKhUKhUCgUii0ApbgrFAqFQqFQKBRbAEpxVygUCoVCoVAotgCU4q5QKBQKhUKhUGwB/D9puKdf6ge0uwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 1008x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize=(14,4))\n",
    "sc = ax.scatter(x_test[\"tfidf_word_match\"], x_test[\"word_match\"], alpha=1, c=p_test)\n",
    "fig.colorbar(sc, ax=ax)\n",
    "plt.ylabel(\"word_match\")\n",
    "plt.xlabel(\"tfidf_word_match\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a7898e54",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2a4605a2",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "8ce9939c",
   "metadata": {},
   "source": [
    "question1和question2都有缺失值，有缺失值应该认为是不一样的问题，这里删除这些行。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "id": "df603b13",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_train=df_train[df_train['question1'].isnull()==False]\n",
    "df_train=df_train[df_train['question2'].isnull()==False]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "id": "e7ccf70a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(404287, 6)"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "850b2e84",
   "metadata": {},
   "source": [
    "**meta-features**\n",
    "* number of common tokens(non-stopwords) in both the questions\n",
    "* tokens count difference"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "id": "ac89df4f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'!\"#$%&\\'()*+,-./:;<=>?@[\\\\]^_`{|}~'"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "string.punctuation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "id": "c6ec5149",
   "metadata": {},
   "outputs": [],
   "source": [
    "import re, string, six\n",
    "\n",
    "from nltk.corpus import stopwords\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "re_tok = re.compile(f'([{string.punctuation}“”¨«»®´·º½¾¿¡§£₤‘’])')# 以 f开头表示在字符串内支持大括号内的python 表达式\n",
    "\n",
    "def tokenize(s): \n",
    "    return re_tok.sub(r' \\1 ', s).split()#去掉反斜杠的转移机制\n",
    "\n",
    "def clean_text(s):\n",
    "    try:\n",
    "        return re.sub(r'[^A-Za-z0-9,?\"\\'. ]+', '', s).encode('utf-8').decode('utf-8').lower()\n",
    "    except:\n",
    "        return \"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "id": "2301629f",
   "metadata": {},
   "outputs": [],
   "source": [
    "stops = set(stopwords.words(\"english\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "id": "d0d9cfa5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "127\n",
      "{'am', 'did', 'being', 'him', 'just', 'again', 'has', 'once', 'each', 'not', 'our', 'at', 'how', 'over', 'is', 'up', 'few', 'an', 'such', 'no', 'there', 'me', 'doing', 'than', 'about', 'but', 'it', 'some', 'them', 'above', 'of', 'with', 'after', 'whom', 'from', 'were', 'as', 'to', 'because', 'having', 'all', 'for', 'these', 'its', 'where', 'own', 'was', 'most', 'very', 'your', 'off', 'a', 'too', 'will', 'then', 'their', 'here', 'why', 'both', 'only', 'itself', 'yourself', 'myself', 'under', 'have', 'and', 'through', 'should', 'or', 'be', 'had', 'themselves', 'ours', 'while', 'before', 'you', 'so', 'he', 'by', 'nor', 'which', 'don', 'more', 'her', 'on', 'if', 'in', 'ourselves', 'that', 'she', 's', 'hers', 'into', 'what', 'down', 'during', 'further', 'herself', 'this', 't', 'his', 'theirs', 'we', 'now', 'out', 'below', 'been', 'same', 'himself', 'my', 'between', 'who', 'when', 'other', 'yours', 'against', 'they', 'does', 'until', 'any', 'are', 'i', 'do', 'can', 'the', 'yourselves', 'those'}\n"
     ]
    }
   ],
   "source": [
    "print(len(stops))\n",
    "print(stops)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "id": "3f801b9a",
   "metadata": {},
   "outputs": [],
   "source": [
    "def word_match_share(row):\n",
    "    q1words = {}\n",
    "    q2words = {}\n",
    "    try:\n",
    "        for word in tokenize(row['question1']):\n",
    "            if word not in stops:\n",
    "                q1words[word] = 1\n",
    "        for word in tokenize(row['question2']):\n",
    "            if word not in stops:\n",
    "                q2words[word] = 1\n",
    "        if len(q1words) == 0 or len(q2words) == 0:\n",
    "            return 0\n",
    "        shared_words_in_q1 = [w for w in q1words.keys() if w in q2words]\n",
    "        shared_words_in_q2 = [w for w in q2words.keys() if w in q1words]\n",
    "        return (len(shared_words_in_q1) + len(shared_words_in_q2))/(len(q1words) + len(q2words))\n",
    "    except:\n",
    "        return 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "id": "e96b9597",
   "metadata": {},
   "outputs": [],
   "source": [
    "def word_count_diff(row):\n",
    "    try:\n",
    "        q1words = len(list(filter(lambda x: x.lower() not in stops, tokenize(row['question1']))))\n",
    "        q2words = len(list(filter(lambda x: x.lower() not in stops, tokenize(row['question2']))))\n",
    "        return abs(q1words - q2words)\n",
    "    except:\n",
    "        return 50"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "id": "27067190",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_train['wms'] = df_train.apply(word_match_share, axis=1)\n",
    "df_train['wcd'] = df_train.apply(word_count_diff, axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "id": "dccdf57e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>qid1</th>\n",
       "      <th>qid2</th>\n",
       "      <th>question1</th>\n",
       "      <th>question2</th>\n",
       "      <th>is_duplicate</th>\n",
       "      <th>wms</th>\n",
       "      <th>wcd</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>What is the step by step guide to invest in sh...</td>\n",
       "      <td>What is the step by step guide to invest in sh...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.933333</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>What is the story of Kohinoor (Koh-i-Noor) Dia...</td>\n",
       "      <td>What would happen if the Indian government sto...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.640000</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>5</td>\n",
       "      <td>6</td>\n",
       "      <td>How can I increase the speed of my internet co...</td>\n",
       "      <td>How can Internet speed be increased by hacking...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.375000</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>7</td>\n",
       "      <td>8</td>\n",
       "      <td>Why am I mentally very lonely? How can I solve...</td>\n",
       "      <td>Find the remainder when [math]23^{24}[/math] i...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.095238</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>9</td>\n",
       "      <td>10</td>\n",
       "      <td>Which one dissolve in water quikly sugar, salt...</td>\n",
       "      <td>Which fish would survive in salt water?</td>\n",
       "      <td>0</td>\n",
       "      <td>0.400000</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   id  qid1  qid2                                          question1  \\\n",
       "0   0     1     2  What is the step by step guide to invest in sh...   \n",
       "1   1     3     4  What is the story of Kohinoor (Koh-i-Noor) Dia...   \n",
       "2   2     5     6  How can I increase the speed of my internet co...   \n",
       "3   3     7     8  Why am I mentally very lonely? How can I solve...   \n",
       "4   4     9    10  Which one dissolve in water quikly sugar, salt...   \n",
       "\n",
       "                                           question2  is_duplicate       wms  \\\n",
       "0  What is the step by step guide to invest in sh...             0  0.933333   \n",
       "1  What would happen if the Indian government sto...             0  0.640000   \n",
       "2  How can Internet speed be increased by hacking...             0  0.375000   \n",
       "3  Find the remainder when [math]23^{24}[/math] i...             0  0.095238   \n",
       "4            Which fish would survive in salt water?             0  0.400000   \n",
       "\n",
       "   wcd  \n",
       "0    1  \n",
       "1    5  \n",
       "2    1  \n",
       "3   14  \n",
       "4    7  "
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "id": "38ef314a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>is_duplicate</th>\n",
       "      <th>wcd</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>3.058971</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>1.514843</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   is_duplicate       wcd\n",
       "0             0  3.058971\n",
       "1             1  1.514843"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train.groupby(['is_duplicate']).agg({'wcd': np.mean}).reset_index()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "id": "bfeb4640",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_train['question1'] = df_train['question1'].apply(lambda x: clean_text(x))\n",
    "df_train['question2'] = df_train['question2'].apply(lambda x: clean_text(x))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "id": "f433a57d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>qid1</th>\n",
       "      <th>qid2</th>\n",
       "      <th>question1</th>\n",
       "      <th>question2</th>\n",
       "      <th>is_duplicate</th>\n",
       "      <th>wms</th>\n",
       "      <th>wcd</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>what is the step by step guide to invest in sh...</td>\n",
       "      <td>what is the step by step guide to invest in sh...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.933333</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>what is the story of kohinoor kohinoor diamond?</td>\n",
       "      <td>what would happen if the indian government sto...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.640000</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>5</td>\n",
       "      <td>6</td>\n",
       "      <td>how can i increase the speed of my internet co...</td>\n",
       "      <td>how can internet speed be increased by hacking...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.375000</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>7</td>\n",
       "      <td>8</td>\n",
       "      <td>why am i mentally very lonely? how can i solve...</td>\n",
       "      <td>find the remainder when math2324math is divide...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.095238</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>9</td>\n",
       "      <td>10</td>\n",
       "      <td>which one dissolve in water quikly sugar, salt...</td>\n",
       "      <td>which fish would survive in salt water?</td>\n",
       "      <td>0</td>\n",
       "      <td>0.400000</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>404285</th>\n",
       "      <td>404285</td>\n",
       "      <td>433578</td>\n",
       "      <td>379845</td>\n",
       "      <td>how many keywords are there in the racket prog...</td>\n",
       "      <td>how many keywords are there in perl programmin...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>404286</th>\n",
       "      <td>404286</td>\n",
       "      <td>18840</td>\n",
       "      <td>155606</td>\n",
       "      <td>do you believe there is life after death?</td>\n",
       "      <td>is it true that there is life after death?</td>\n",
       "      <td>1</td>\n",
       "      <td>0.600000</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>404287</th>\n",
       "      <td>404287</td>\n",
       "      <td>537928</td>\n",
       "      <td>537929</td>\n",
       "      <td>what is one coin?</td>\n",
       "      <td>what's this coin?</td>\n",
       "      <td>0</td>\n",
       "      <td>0.750000</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>404288</th>\n",
       "      <td>404288</td>\n",
       "      <td>537930</td>\n",
       "      <td>537931</td>\n",
       "      <td>what is the approx annual cost of living while...</td>\n",
       "      <td>i am having little hairfall problem but i want...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.133333</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>404289</th>\n",
       "      <td>404289</td>\n",
       "      <td>537932</td>\n",
       "      <td>537933</td>\n",
       "      <td>what is like to have sex with cousin?</td>\n",
       "      <td>what is it like to have sex with your cousin?</td>\n",
       "      <td>0</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>404287 rows × 8 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "            id    qid1    qid2  \\\n",
       "0            0       1       2   \n",
       "1            1       3       4   \n",
       "2            2       5       6   \n",
       "3            3       7       8   \n",
       "4            4       9      10   \n",
       "...        ...     ...     ...   \n",
       "404285  404285  433578  379845   \n",
       "404286  404286   18840  155606   \n",
       "404287  404287  537928  537929   \n",
       "404288  404288  537930  537931   \n",
       "404289  404289  537932  537933   \n",
       "\n",
       "                                                question1  \\\n",
       "0       what is the step by step guide to invest in sh...   \n",
       "1         what is the story of kohinoor kohinoor diamond?   \n",
       "2       how can i increase the speed of my internet co...   \n",
       "3       why am i mentally very lonely? how can i solve...   \n",
       "4       which one dissolve in water quikly sugar, salt...   \n",
       "...                                                   ...   \n",
       "404285  how many keywords are there in the racket prog...   \n",
       "404286          do you believe there is life after death?   \n",
       "404287                                  what is one coin?   \n",
       "404288  what is the approx annual cost of living while...   \n",
       "404289              what is like to have sex with cousin?   \n",
       "\n",
       "                                                question2  is_duplicate  \\\n",
       "0       what is the step by step guide to invest in sh...             0   \n",
       "1       what would happen if the indian government sto...             0   \n",
       "2       how can internet speed be increased by hacking...             0   \n",
       "3       find the remainder when math2324math is divide...             0   \n",
       "4                 which fish would survive in salt water?             0   \n",
       "...                                                   ...           ...   \n",
       "404285  how many keywords are there in perl programmin...             0   \n",
       "404286         is it true that there is life after death?             1   \n",
       "404287                                  what's this coin?             0   \n",
       "404288  i am having little hairfall problem but i want...             0   \n",
       "404289      what is it like to have sex with your cousin?             0   \n",
       "\n",
       "             wms  wcd  \n",
       "0       0.933333    1  \n",
       "1       0.640000    5  \n",
       "2       0.375000    1  \n",
       "3       0.095238   14  \n",
       "4       0.400000    7  \n",
       "...          ...  ...  \n",
       "404285  0.666667    0  \n",
       "404286  0.600000    0  \n",
       "404287  0.750000    0  \n",
       "404288  0.133333    5  \n",
       "404289  1.000000    0  \n",
       "\n",
       "[404287 rows x 8 columns]"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "id": "11cc8fca",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "seed = 12345\n",
    "\n",
    "X = df_train.iloc[:,6:]\n",
    "Y = df_train['is_duplicate']\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.20, random_state=seed)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "id": "4489d6bc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>wms</th>\n",
       "      <th>wcd</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.933333</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.640000</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.375000</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.095238</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.400000</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>404285</th>\n",
       "      <td>0.666667</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>404286</th>\n",
       "      <td>0.600000</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>404287</th>\n",
       "      <td>0.750000</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>404288</th>\n",
       "      <td>0.133333</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>404289</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>404287 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "             wms  wcd\n",
       "0       0.933333    1\n",
       "1       0.640000    5\n",
       "2       0.375000    1\n",
       "3       0.095238   14\n",
       "4       0.400000    7\n",
       "...          ...  ...\n",
       "404285  0.666667    0\n",
       "404286  0.600000    0\n",
       "404287  0.750000    0\n",
       "404288  0.133333    5\n",
       "404289  1.000000    0\n",
       "\n",
       "[404287 rows x 2 columns]"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "id": "0b546cda",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import mean_squared_error\n",
    "from sklearn.metrics import mean_absolute_error\n",
    "from sklearn.metrics import log_loss\n",
    "import lightgbm as lgb\n",
    "\n",
    "# create dataset for lightgbm\n",
    "lgb_train = lgb.Dataset(X_train, y_train)\n",
    "lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "id": "e4a72bd5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[LightGBM] [Warning] Auto-choosing row-wise multi-threading, the overhead of testing was 0.017061 seconds.\n",
      "You can set `force_row_wise=true` to remove the overhead.\n",
      "And if memory is not enough, you can set `force_col_wise=true`.\n",
      "[1]\tvalid_0's binary_logloss: 0.647628\n",
      "Training until validation scores don't improve for 5 rounds\n",
      "[2]\tvalid_0's binary_logloss: 0.638773\n",
      "[3]\tvalid_0's binary_logloss: 0.630717\n",
      "[4]\tvalid_0's binary_logloss: 0.623371\n",
      "[5]\tvalid_0's binary_logloss: 0.616635\n",
      "[6]\tvalid_0's binary_logloss: 0.610486\n",
      "[7]\tvalid_0's binary_logloss: 0.604852\n",
      "[8]\tvalid_0's binary_logloss: 0.599674\n",
      "[9]\tvalid_0's binary_logloss: 0.594904\n",
      "[10]\tvalid_0's binary_logloss: 0.590519\n",
      "[11]\tvalid_0's binary_logloss: 0.586492\n",
      "[12]\tvalid_0's binary_logloss: 0.582782\n",
      "[13]\tvalid_0's binary_logloss: 0.579345\n",
      "[14]\tvalid_0's binary_logloss: 0.576196\n",
      "[15]\tvalid_0's binary_logloss: 0.573282\n",
      "[16]\tvalid_0's binary_logloss: 0.570592\n",
      "[17]\tvalid_0's binary_logloss: 0.568101\n",
      "[18]\tvalid_0's binary_logloss: 0.565804\n",
      "[19]\tvalid_0's binary_logloss: 0.563667\n",
      "[20]\tvalid_0's binary_logloss: 0.561672\n",
      "Did not meet early stopping. Best iteration is:\n",
      "[20]\tvalid_0's binary_logloss: 0.561672\n"
     ]
    }
   ],
   "source": [
    "# specify your configurations as a dict\n",
    "params = {'boosting_type': 'gbdt','objective': 'binary','metric': 'binary_logloss',\n",
    "          'num_leaves': 31,'learning_rate': 0.05,'feature_fraction': 0.9,\n",
    "          'bagging_fraction': 0.8,'bagging_freq': 5,'verbose': 0}\n",
    "gbm = lgb.train(params,lgb_train,num_boost_round=20,valid_sets=lgb_eval,\n",
    "                early_stopping_rounds=5)\n",
    "# predict\n",
    "y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "id": "a97fd754",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.5616717339249052"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "log_loss(y_test,y_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "id": "76be1cbb",
   "metadata": {},
   "outputs": [],
   "source": [
    "from bayes_opt import BayesianOptimization\n",
    "from sklearn.model_selection import cross_val_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "id": "e79897ea",
   "metadata": {},
   "outputs": [],
   "source": [
    "def lgb_cv(n_estimators,min_split_gain,subsample, max_depth,colsample_bytree, min_child_samples,reg_alpha,reg_lambda,num_leaves,learning_rate):\n",
    "        model = lgb.LGBMClassifier(boosting_type='gbdt', objective='binary',n_jobs=-1,\n",
    "                                   colsample_bytree=float(colsample_bytree),\n",
    "                                   min_child_samples=int(min_child_samples),\n",
    "                                   n_estimators=int(n_estimators),\n",
    "                                   num_leaves=int(num_leaves),\n",
    "                                   reg_alpha=float(reg_alpha),\n",
    "                                   reg_lambda=float(reg_lambda),\n",
    "                                   max_depth=int(max_depth),\n",
    "                                   subsample=float(subsample),\n",
    "                                   min_split_gain = float(min_split_gain),\n",
    "                                   learning_rate=float(learning_rate),\n",
    "                                   )\n",
    "        cv_score = cross_val_score(model, X_train, y_train, scoring='neg_log_loss', cv=5).mean()\n",
    "        return cv_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "id": "f10894a3",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 实例化BayesianOptimization类，参数靠自己去定义取值范围\n",
    "lgb_bo = BayesianOptimization(\n",
    "        lgb_cv,\n",
    "        {\n",
    "        'colsample_bytree': (0.5,1),\n",
    "        'min_child_samples': (2, 200),\n",
    "        'num_leaves': (5, 1000),\n",
    "        'subsample': (0.6, 1),\n",
    "        'max_depth':(2,10),\n",
    "        'n_estimators': (10, 1000),\n",
    "        'reg_alpha':(0,10),\n",
    "        'reg_lambda':(0,10),\n",
    "        'min_split_gain':(0,1),\n",
    "        'learning_rate':(0,1)\n",
    "         },\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "id": "76c92606",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "|   iter    |  target   | colsam... | learni... | max_depth | min_ch... | min_sp... | n_esti... | num_le... | reg_alpha | reg_la... | subsample |\n",
      "-------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "| \u001b[0m 1       \u001b[0m | \u001b[0m-0.5404  \u001b[0m | \u001b[0m 0.5129  \u001b[0m | \u001b[0m 0.05168 \u001b[0m | \u001b[0m 2.257   \u001b[0m | \u001b[0m 125.1   \u001b[0m | \u001b[0m 0.484   \u001b[0m | \u001b[0m 798.9   \u001b[0m | \u001b[0m 946.9   \u001b[0m | \u001b[0m 6.353   \u001b[0m | \u001b[0m 9.638   \u001b[0m | \u001b[0m 0.624   \u001b[0m |\n",
      "| \u001b[95m 2       \u001b[0m | \u001b[95m-0.5354  \u001b[0m | \u001b[95m 0.8488  \u001b[0m | \u001b[95m 0.3836  \u001b[0m | \u001b[95m 5.855   \u001b[0m | \u001b[95m 121.0   \u001b[0m | \u001b[95m 0.5177  \u001b[0m | \u001b[95m 125.6   \u001b[0m | \u001b[95m 6.014   \u001b[0m | \u001b[95m 0.3221  \u001b[0m | \u001b[95m 5.561   \u001b[0m | \u001b[95m 0.8049  \u001b[0m |\n",
      "| \u001b[95m 3       \u001b[0m | \u001b[95m-0.5349  \u001b[0m | \u001b[95m 0.8857  \u001b[0m | \u001b[95m 0.9014  \u001b[0m | \u001b[95m 7.641   \u001b[0m | \u001b[95m 115.2   \u001b[0m | \u001b[95m 0.5408  \u001b[0m | \u001b[95m 646.2   \u001b[0m | \u001b[95m 477.2   \u001b[0m | \u001b[95m 4.582   \u001b[0m | \u001b[95m 5.43    \u001b[0m | \u001b[95m 0.6737  \u001b[0m |\n",
      "| \u001b[95m 4       \u001b[0m | \u001b[95m-0.5346  \u001b[0m | \u001b[95m 0.9325  \u001b[0m | \u001b[95m 0.04133 \u001b[0m | \u001b[95m 9.189   \u001b[0m | \u001b[95m 128.4   \u001b[0m | \u001b[95m 0.6931  \u001b[0m | \u001b[95m 885.7   \u001b[0m | \u001b[95m 352.3   \u001b[0m | \u001b[95m 3.022   \u001b[0m | \u001b[95m 1.162   \u001b[0m | \u001b[95m 0.8601  \u001b[0m |\n",
      "| \u001b[0m 5       \u001b[0m | \u001b[0m-0.5353  \u001b[0m | \u001b[0m 0.8599  \u001b[0m | \u001b[0m 0.6532  \u001b[0m | \u001b[0m 4.823   \u001b[0m | \u001b[0m 6.859   \u001b[0m | \u001b[0m 0.5175  \u001b[0m | \u001b[0m 351.9   \u001b[0m | \u001b[0m 324.2   \u001b[0m | \u001b[0m 4.073   \u001b[0m | \u001b[0m 5.198   \u001b[0m | \u001b[0m 0.6475  \u001b[0m |\n",
      "| \u001b[0m 6       \u001b[0m | \u001b[0m-0.5398  \u001b[0m | \u001b[0m 0.6812  \u001b[0m | \u001b[0m 0.8469  \u001b[0m | \u001b[0m 6.474   \u001b[0m | \u001b[0m 118.6   \u001b[0m | \u001b[0m 0.7749  \u001b[0m | \u001b[0m 131.9   \u001b[0m | \u001b[0m 12.01   \u001b[0m | \u001b[0m 2.214   \u001b[0m | \u001b[0m 1.216   \u001b[0m | \u001b[0m 0.7231  \u001b[0m |\n",
      "| \u001b[0m 7       \u001b[0m | \u001b[0m-0.5393  \u001b[0m | \u001b[0m 0.6066  \u001b[0m | \u001b[0m 0.7297  \u001b[0m | \u001b[0m 6.681   \u001b[0m | \u001b[0m 39.93   \u001b[0m | \u001b[0m 0.02043 \u001b[0m | \u001b[0m 821.6   \u001b[0m | \u001b[0m 82.9    \u001b[0m | \u001b[0m 3.601   \u001b[0m | \u001b[0m 3.284   \u001b[0m | \u001b[0m 0.8331  \u001b[0m |\n",
      "| \u001b[0m 8       \u001b[0m | \u001b[0m-0.5394  \u001b[0m | \u001b[0m 0.626   \u001b[0m | \u001b[0m 0.7365  \u001b[0m | \u001b[0m 4.828   \u001b[0m | \u001b[0m 39.24   \u001b[0m | \u001b[0m 0.1259  \u001b[0m | \u001b[0m 205.3   \u001b[0m | \u001b[0m 973.5   \u001b[0m | \u001b[0m 0.2989  \u001b[0m | \u001b[0m 7.616   \u001b[0m | \u001b[0m 0.7559  \u001b[0m |\n",
      "| \u001b[0m 9       \u001b[0m | \u001b[0m-0.5397  \u001b[0m | \u001b[0m 0.7483  \u001b[0m | \u001b[0m 0.517   \u001b[0m | \u001b[0m 2.633   \u001b[0m | \u001b[0m 173.5   \u001b[0m | \u001b[0m 0.1086  \u001b[0m | \u001b[0m 875.1   \u001b[0m | \u001b[0m 666.2   \u001b[0m | \u001b[0m 6.597   \u001b[0m | \u001b[0m 1.589   \u001b[0m | \u001b[0m 0.9269  \u001b[0m |\n",
      "| \u001b[0m 10      \u001b[0m | \u001b[0m-0.5395  \u001b[0m | \u001b[0m 0.5792  \u001b[0m | \u001b[0m 0.4751  \u001b[0m | \u001b[0m 6.498   \u001b[0m | \u001b[0m 159.1   \u001b[0m | \u001b[0m 0.02323 \u001b[0m | \u001b[0m 66.91   \u001b[0m | \u001b[0m 170.3   \u001b[0m | \u001b[0m 4.557   \u001b[0m | \u001b[0m 7.798   \u001b[0m | \u001b[0m 0.9655  \u001b[0m |\n",
      "| \u001b[0m 11      \u001b[0m | \u001b[0m-0.5352  \u001b[0m | \u001b[0m 0.8314  \u001b[0m | \u001b[0m 0.8635  \u001b[0m | \u001b[0m 3.43    \u001b[0m | \u001b[0m 73.89   \u001b[0m | \u001b[0m 0.05723 \u001b[0m | \u001b[0m 320.7   \u001b[0m | \u001b[0m 653.9   \u001b[0m | \u001b[0m 9.299   \u001b[0m | \u001b[0m 3.51    \u001b[0m | \u001b[0m 0.9162  \u001b[0m |\n",
      "| \u001b[0m 12      \u001b[0m | \u001b[0m-0.5396  \u001b[0m | \u001b[0m 0.5735  \u001b[0m | \u001b[0m 0.6551  \u001b[0m | \u001b[0m 7.321   \u001b[0m | \u001b[0m 114.9   \u001b[0m | \u001b[0m 0.3038  \u001b[0m | \u001b[0m 628.6   \u001b[0m | \u001b[0m 908.7   \u001b[0m | \u001b[0m 3.773   \u001b[0m | \u001b[0m 8.609   \u001b[0m | \u001b[0m 0.6465  \u001b[0m |\n",
      "| \u001b[95m 13      \u001b[0m | \u001b[95m-0.5344  \u001b[0m | \u001b[95m 0.8618  \u001b[0m | \u001b[95m 0.8888  \u001b[0m | \u001b[95m 8.302   \u001b[0m | \u001b[95m 124.0   \u001b[0m | \u001b[95m 0.1434  \u001b[0m | \u001b[95m 218.0   \u001b[0m | \u001b[95m 37.37   \u001b[0m | \u001b[95m 1.38    \u001b[0m | \u001b[95m 8.755   \u001b[0m | \u001b[95m 0.7302  \u001b[0m |\n",
      "| \u001b[0m 14      \u001b[0m | \u001b[0m-0.5347  \u001b[0m | \u001b[0m 0.8808  \u001b[0m | \u001b[0m 0.4924  \u001b[0m | \u001b[0m 4.016   \u001b[0m | \u001b[0m 20.14   \u001b[0m | \u001b[0m 0.07866 \u001b[0m | \u001b[0m 777.0   \u001b[0m | \u001b[0m 659.1   \u001b[0m | \u001b[0m 3.726   \u001b[0m | \u001b[0m 3.798   \u001b[0m | \u001b[0m 0.7984  \u001b[0m |\n",
      "| \u001b[0m 15      \u001b[0m | \u001b[0m-0.5401  \u001b[0m | \u001b[0m 0.7078  \u001b[0m | \u001b[0m 0.5977  \u001b[0m | \u001b[0m 4.747   \u001b[0m | \u001b[0m 162.2   \u001b[0m | \u001b[0m 0.7066  \u001b[0m | \u001b[0m 957.3   \u001b[0m | \u001b[0m 544.1   \u001b[0m | \u001b[0m 6.978   \u001b[0m | \u001b[0m 8.736   \u001b[0m | \u001b[0m 0.9745  \u001b[0m |\n",
      "| \u001b[0m 16      \u001b[0m | \u001b[0m-0.5353  \u001b[0m | \u001b[0m 0.9299  \u001b[0m | \u001b[0m 0.432   \u001b[0m | \u001b[0m 3.648   \u001b[0m | \u001b[0m 31.71   \u001b[0m | \u001b[0m 0.1297  \u001b[0m | \u001b[0m 187.2   \u001b[0m | \u001b[0m 508.9   \u001b[0m | \u001b[0m 7.538   \u001b[0m | \u001b[0m 6.972   \u001b[0m | \u001b[0m 0.9217  \u001b[0m |\n",
      "| \u001b[0m 17      \u001b[0m | \u001b[0m-0.5349  \u001b[0m | \u001b[0m 0.8467  \u001b[0m | \u001b[0m 0.8758  \u001b[0m | \u001b[0m 9.995   \u001b[0m | \u001b[0m 135.6   \u001b[0m | \u001b[0m 0.8666  \u001b[0m | \u001b[0m 312.1   \u001b[0m | \u001b[0m 100.4   \u001b[0m | \u001b[0m 3.164   \u001b[0m | \u001b[0m 2.402   \u001b[0m | \u001b[0m 0.9103  \u001b[0m |\n",
      "| \u001b[0m 18      \u001b[0m | \u001b[0m-0.5351  \u001b[0m | \u001b[0m 0.769   \u001b[0m | \u001b[0m 0.7042  \u001b[0m | \u001b[0m 7.466   \u001b[0m | \u001b[0m 177.2   \u001b[0m | \u001b[0m 0.6202  \u001b[0m | \u001b[0m 498.0   \u001b[0m | \u001b[0m 579.4   \u001b[0m | \u001b[0m 1.481   \u001b[0m | \u001b[0m 7.215   \u001b[0m | \u001b[0m 0.8989  \u001b[0m |\n",
      "| \u001b[0m 19      \u001b[0m | \u001b[0m-0.5397  \u001b[0m | \u001b[0m 0.6716  \u001b[0m | \u001b[0m 0.9571  \u001b[0m | \u001b[0m 4.81    \u001b[0m | \u001b[0m 60.72   \u001b[0m | \u001b[0m 0.2939  \u001b[0m | \u001b[0m 600.6   \u001b[0m | \u001b[0m 56.77   \u001b[0m | \u001b[0m 4.689   \u001b[0m | \u001b[0m 9.977   \u001b[0m | \u001b[0m 0.6949  \u001b[0m |\n",
      "| \u001b[0m 20      \u001b[0m | \u001b[0m-0.5399  \u001b[0m | \u001b[0m 0.6389  \u001b[0m | \u001b[0m 0.3946  \u001b[0m | \u001b[0m 7.543   \u001b[0m | \u001b[0m 34.39   \u001b[0m | \u001b[0m 0.5706  \u001b[0m | \u001b[0m 719.6   \u001b[0m | \u001b[0m 856.6   \u001b[0m | \u001b[0m 9.512   \u001b[0m | \u001b[0m 3.496   \u001b[0m | \u001b[0m 0.7056  \u001b[0m |\n",
      "| \u001b[0m 21      \u001b[0m | \u001b[0m-0.5403  \u001b[0m | \u001b[0m 0.721   \u001b[0m | \u001b[0m 0.05086 \u001b[0m | \u001b[0m 5.67    \u001b[0m | \u001b[0m 23.08   \u001b[0m | \u001b[0m 0.8679  \u001b[0m | \u001b[0m 600.5   \u001b[0m | \u001b[0m 774.6   \u001b[0m | \u001b[0m 9.851   \u001b[0m | \u001b[0m 0.5802  \u001b[0m | \u001b[0m 0.681   \u001b[0m |\n",
      "| \u001b[0m 22      \u001b[0m | \u001b[0m-0.5355  \u001b[0m | \u001b[0m 0.9156  \u001b[0m | \u001b[0m 0.3655  \u001b[0m | \u001b[0m 4.836   \u001b[0m | \u001b[0m 124.7   \u001b[0m | \u001b[0m 0.4939  \u001b[0m | \u001b[0m 883.8   \u001b[0m | \u001b[0m 361.8   \u001b[0m | \u001b[0m 5.414   \u001b[0m | \u001b[0m 2.117   \u001b[0m | \u001b[0m 0.6424  \u001b[0m |\n",
      "| \u001b[0m 23      \u001b[0m | \u001b[0m-0.5399  \u001b[0m | \u001b[0m 0.6834  \u001b[0m | \u001b[0m 0.1106  \u001b[0m | \u001b[0m 6.029   \u001b[0m | \u001b[0m 68.59   \u001b[0m | \u001b[0m 0.4547  \u001b[0m | \u001b[0m 374.2   \u001b[0m | \u001b[0m 613.7   \u001b[0m | \u001b[0m 6.405   \u001b[0m | \u001b[0m 6.025   \u001b[0m | \u001b[0m 0.8418  \u001b[0m |\n",
      "| \u001b[0m 24      \u001b[0m | \u001b[0m-0.5395  \u001b[0m | \u001b[0m 0.5444  \u001b[0m | \u001b[0m 0.3956  \u001b[0m | \u001b[0m 8.305   \u001b[0m | \u001b[0m 159.3   \u001b[0m | \u001b[0m 0.3779  \u001b[0m | \u001b[0m 861.7   \u001b[0m | \u001b[0m 574.4   \u001b[0m | \u001b[0m 2.407   \u001b[0m | \u001b[0m 1.069   \u001b[0m | \u001b[0m 0.6967  \u001b[0m |\n",
      "| \u001b[0m 25      \u001b[0m | \u001b[0m-0.5396  \u001b[0m | \u001b[0m 0.7362  \u001b[0m | \u001b[0m 0.6238  \u001b[0m | \u001b[0m 3.476   \u001b[0m | \u001b[0m 81.79   \u001b[0m | \u001b[0m 0.1182  \u001b[0m | \u001b[0m 741.0   \u001b[0m | \u001b[0m 527.6   \u001b[0m | \u001b[0m 3.692   \u001b[0m | \u001b[0m 4.865   \u001b[0m | \u001b[0m 0.8672  \u001b[0m |\n",
      "| \u001b[0m 26      \u001b[0m | \u001b[0m-0.5396  \u001b[0m | \u001b[0m 0.5063  \u001b[0m | \u001b[0m 0.3223  \u001b[0m | \u001b[0m 7.171   \u001b[0m | \u001b[0m 134.4   \u001b[0m | \u001b[0m 0.5825  \u001b[0m | \u001b[0m 943.9   \u001b[0m | \u001b[0m 361.8   \u001b[0m | \u001b[0m 1.432   \u001b[0m | \u001b[0m 3.854   \u001b[0m | \u001b[0m 0.7514  \u001b[0m |\n",
      "| \u001b[0m 27      \u001b[0m | \u001b[0m-0.5347  \u001b[0m | \u001b[0m 0.9524  \u001b[0m | \u001b[0m 0.668   \u001b[0m | \u001b[0m 8.765   \u001b[0m | \u001b[0m 6.275   \u001b[0m | \u001b[0m 0.2738  \u001b[0m | \u001b[0m 720.3   \u001b[0m | \u001b[0m 983.8   \u001b[0m | \u001b[0m 4.937   \u001b[0m | \u001b[0m 3.689   \u001b[0m | \u001b[0m 0.6432  \u001b[0m |\n",
      "| \u001b[0m 28      \u001b[0m | \u001b[0m-0.5398  \u001b[0m | \u001b[0m 0.727   \u001b[0m | \u001b[0m 0.643   \u001b[0m | \u001b[0m 5.512   \u001b[0m | \u001b[0m 198.7   \u001b[0m | \u001b[0m 0.3377  \u001b[0m | \u001b[0m 641.8   \u001b[0m | \u001b[0m 714.6   \u001b[0m | \u001b[0m 4.566   \u001b[0m | \u001b[0m 9.161   \u001b[0m | \u001b[0m 0.8178  \u001b[0m |\n",
      "| \u001b[0m 29      \u001b[0m | \u001b[0m-0.5355  \u001b[0m | \u001b[0m 0.8196  \u001b[0m | \u001b[0m 0.6403  \u001b[0m | \u001b[0m 6.453   \u001b[0m | \u001b[0m 64.63   \u001b[0m | \u001b[0m 0.9758  \u001b[0m | \u001b[0m 862.1   \u001b[0m | \u001b[0m 593.3   \u001b[0m | \u001b[0m 6.863   \u001b[0m | \u001b[0m 1.682   \u001b[0m | \u001b[0m 0.6207  \u001b[0m |\n",
      "| \u001b[0m 30      \u001b[0m | \u001b[0m-0.5348  \u001b[0m | \u001b[0m 0.873   \u001b[0m | \u001b[0m 0.8371  \u001b[0m | \u001b[0m 6.98    \u001b[0m | \u001b[0m 25.6    \u001b[0m | \u001b[0m 0.3749  \u001b[0m | \u001b[0m 926.2   \u001b[0m | \u001b[0m 770.8   \u001b[0m | \u001b[0m 4.183   \u001b[0m | \u001b[0m 3.367   \u001b[0m | \u001b[0m 0.6184  \u001b[0m |\n",
      "=================================================================================================================================================\n"
     ]
    }
   ],
   "source": [
    "# 训练\n",
    "lgb_bo.maximize()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "id": "b868a13a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'target': -0.5343728330020127, 'params': {'colsample_bytree': 0.8617558650288266, 'learning_rate': 0.8887569455441605, 'max_depth': 8.301685196278695, 'min_child_samples': 124.02249604271428, 'min_split_gain': 0.14340188311502522, 'n_estimators': 218.00430917531367, 'num_leaves': 37.367526479056494, 'reg_alpha': 1.3798749213580985, 'reg_lambda': 8.75479513746093, 'subsample': 0.7301959165813758}}\n"
     ]
    }
   ],
   "source": [
    "print(lgb_bo.max)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "id": "af748cab",
   "metadata": {},
   "outputs": [],
   "source": [
    "lgb_train = lgb.Dataset(X_train, y_train)\n",
    "lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "id": "29ea220b",
   "metadata": {},
   "outputs": [],
   "source": [
    "params={'boosting_type': 'gbdt','objective': 'binary','metric': 'binary_logloss',\n",
    "        'colsample_bytree': lgb_bo.max['params']['colsample_bytree'], \n",
    "        'learning_rate': lgb_bo.max['params']['learning_rate'], \n",
    "        'max_depth': int(round(lgb_bo.max['params']['max_depth'])), \n",
    "        'min_child_samples': int(round(lgb_bo.max['params']['min_child_samples'])), \n",
    "        'min_split_gain': lgb_bo.max['params']['min_split_gain'],\n",
    "        'n_estimators': int(round(lgb_bo.max['params']['n_estimators'])), \n",
    "        'num_leaves': int(round(lgb_bo.max['params']['num_leaves'])), \n",
    "        'reg_alpha': lgb_bo.max['params']['reg_alpha'], \n",
    "        'reg_lambda': lgb_bo.max['params']['reg_lambda'], \n",
    "        'subsample': lgb_bo.max['params']['subsample']}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "id": "c109d290",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'boosting_type': 'gbdt',\n",
       " 'objective': 'binary',\n",
       " 'metric': 'binary_logloss',\n",
       " 'colsample_bytree': 0.8617558650288266,\n",
       " 'learning_rate': 0.8887569455441605,\n",
       " 'max_depth': 8,\n",
       " 'min_child_samples': 124,\n",
       " 'min_split_gain': 0.14340188311502522,\n",
       " 'n_estimators': 218,\n",
       " 'num_leaves': 37,\n",
       " 'reg_alpha': 1.3798749213580985,\n",
       " 'reg_lambda': 8.75479513746093,\n",
       " 'subsample': 0.7301959165813758}"
      ]
     },
     "execution_count": 108,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "params"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "id": "c1dfbee7",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Administrator\\anaconda3\\lib\\site-packages\\lightgbm\\engine.py:148: UserWarning: Found `n_estimators` in params. Will use it instead of argument\n",
      "  _log_warning(\"Found `{}` in params. Will use it instead of argument\".format(alias))\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[LightGBM] [Info] Number of positive: 119584, number of negative: 203845\n",
      "[LightGBM] [Warning] Auto-choosing col-wise multi-threading, the overhead of testing was 0.106863 seconds.\n",
      "You can set `force_col_wise=true` to remove the overhead.\n",
      "[LightGBM] [Info] Total Bins 238\n",
      "[LightGBM] [Info] Number of data points in the train set: 323429, number of used features: 2\n",
      "[LightGBM] [Info] [binary:BoostFromScore]: pavg=0.369738 -> initscore=-0.533341\n",
      "[LightGBM] [Info] Start training from score -0.533341\n",
      "[1]\tvalid_0's binary_logloss: 0.553709\n",
      "Training until validation scores don't improve for 5 rounds\n",
      "[2]\tvalid_0's binary_logloss: 0.540305\n",
      "[3]\tvalid_0's binary_logloss: 0.536778\n",
      "[4]\tvalid_0's binary_logloss: 0.535903\n",
      "[5]\tvalid_0's binary_logloss: 0.535457\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[6]\tvalid_0's binary_logloss: 0.535284\n",
      "[7]\tvalid_0's binary_logloss: 0.535165\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[8]\tvalid_0's binary_logloss: 0.534941\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[9]\tvalid_0's binary_logloss: 0.534787\n",
      "[10]\tvalid_0's binary_logloss: 0.534801\n",
      "[11]\tvalid_0's binary_logloss: 0.534735\n",
      "[12]\tvalid_0's binary_logloss: 0.534676\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[13]\tvalid_0's binary_logloss: 0.534671\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] Stopped training because there are no more leaves that meet the split requirements\n",
      "[14]\tvalid_0's binary_logloss: 0.534671\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] Stopped training because there are no more leaves that meet the split requirements\n",
      "[15]\tvalid_0's binary_logloss: 0.534671\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] Stopped training because there are no more leaves that meet the split requirements\n",
      "[16]\tvalid_0's binary_logloss: 0.534671\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] Stopped training because there are no more leaves that meet the split requirements\n",
      "[17]\tvalid_0's binary_logloss: 0.534671\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] Stopped training because there are no more leaves that meet the split requirements\n",
      "[18]\tvalid_0's binary_logloss: 0.534671\n",
      "Early stopping, best iteration is:\n",
      "[13]\tvalid_0's binary_logloss: 0.534671\n"
     ]
    }
   ],
   "source": [
    "gbm = lgb.train(params,\n",
    "                lgb_train,\n",
    "                num_boost_round=20,\n",
    "                valid_sets=lgb_eval,\n",
    "                early_stopping_rounds=5)\n",
    "y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1373b700",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
